<!DOCTYPE html>
<!-- saved from url=(0045)https://my.oschina.net/u/2590759/blog/3012574 -->
<html lang="zh"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <meta http-equiv="Content-Language" content="zh-CN">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="referrer" content="always">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
        <title>验证码识别技术——CNN+BLSTM+CTC从训练到部署 - kerlomz的个人空间 - OSCHINA - 中文开源技术交流社区</title>
            <meta name="keywords" content="CTC,YAML,Bazel,Tornado,TensorFlow,kerlomz,,验证码识别技术——CNN+BLSTM+CTC从训练到部署 - kerlomz的个人空间,OSCHINA博客">
                <meta name="description" content="项目地址：https://github.com/kerlomz/captcha_trainer 1. 前言 本项目适用于Python3.6，GPU&gt;=NVIDIA GTX1050Ti，原master分支已经正式切换为CNN+LSTM+CTC的版本了，是时候写一篇新的文章了。 长话短说，开门见山...">
        <link rel="stylesheet" type="text/css" href="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/semantic.min.css">
                <link type="text/css" rel="stylesheet" href="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/space.20dbb3ed.css">        <script charset="utf-8" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/UrlChangeTracker.js.下载"></script><script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/hm.js.下载"></script><script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/push.js.下载"></script><script type="text/javascript">window.__STATIC_DOMAIN = "https://static.oschina.net";</script>
    <script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/jquery.min.js.下载"></script>
    <link rel="shortcut icon" type="image/x-icon" href="https://static.oschina.net/new-osc/img/favicon.ico">
    <link rel="alternate" type="application/rss+xml" title="最新开源项目" href="https://www.oschina.net/project/rss">
    <link rel="alternate" type="application/rss+xml" title="最新开源资讯" href="https://www.oschina.net/news/rss">
    <link rel="alternate" type="application/rss+xml" title="最新问题列表" href="https://www.oschina.net/question/rss">
    <link rel="alternate" type="application/rss+xml" title="最新翻译列表" href="https://www.oschina.net/translate/rss">
    <link rel="alternate" type="application/rss+xml" title="最新博客列表" href="https://www.oschina.net/blog/rss">
    <link rel="alternate" type="application/rss+xml" title="推荐博客列表" href="https://www.oschina.net/blog/rss?show=more">
    <link rel="alternate" type="application/rss+xml" title="推荐软件列表" href="https://www.oschina.net/project/rss?show=recomms">
    <link rel="alternate" type="application/rss+xml" title="最新代码分享列表" href="https://www.oschina.net/code/rss">
    <link rel="alternate" type="application/rss+xml" title="OSCHINA - 源码列表" href="https://www.oschina.net/code/source_rss">

    <link rel="alternate" type="application/rss+xml" title="OpenVINO 中文社区最新文章" href="https://www.oschina.net/groups/rss?ident=openvino">
    <link rel="alternate" type="application/rss+xml" title="大前端最新文章" href="https://www.oschina.net/groups/rss?ident=cross-front">
    <link rel="alternate" type="application/rss+xml" title="开发技能最新文章" href="https://www.oschina.net/groups/rss?ident=skill">
    <link rel="alternate" type="application/rss+xml" title="数据库最新文章" href="https://www.oschina.net/groups/rss?ident=database">
    <link rel="alternate" type="application/rss+xml" title="云计算最新文章" href="https://www.oschina.net/groups/rss?ident=cloud">
    <link rel="alternate" type="application/rss+xml" title="飞桨专区最新文章" href="https://www.oschina.net/groups/rss?ident=paddlepaddle">
    <link rel="alternate" type="application/rss+xml" title="HarmonyOS专区最新文章" href="https://www.oschina.net/groups/rss?ident=harmonyos">
    <link rel="alternate" type="application/rss+xml" title="开源治理最新文章" href="https://www.oschina.net/groups/rss?ident=osgovernance">
    <link rel="alternate" type="application/rss+xml" title="程序人生最新文章" href="https://www.oschina.net/groups/rss?ident=programmer">
    <link rel="alternate" type="application/rss+xml" title="软件架构最新文章" href="https://www.oschina.net/groups/rss?ident=architecture">
    <link rel="alternate" type="application/rss+xml" title="行业趋势最新文章" href="https://www.oschina.net/groups/rss?ident=trend">
    <link rel="alternate" type="application/rss+xml" title="硬件 &amp; IoT最新文章" href="https://www.oschina.net/groups/rss?ident=hardware-iot">
    <link rel="alternate" type="application/rss+xml" title="AI &amp; 大数据最新文章" href="https://www.oschina.net/groups/rss?ident=ai-bigdata">
    <link rel="alternate" type="application/rss+xml" title="PostgreSQL最新文章" href="https://www.oschina.net/groups/rss?ident=postgresql">
    <link rel="alternate" type="application/rss+xml" title="Linux基金会开源软件大学最新文章" href="https://www.oschina.net/groups/rss?ident=lfossu">
    <link rel="alternate" type="application/rss+xml" title="OSCTraining最新文章" href="https://www.oschina.net/groups/rss?ident=OSCTraining">
    <link rel="alternate" type="application/rss+xml" title="EdgeX 中文社区最新文章" href="https://www.oschina.net/groups/rss?ident=edgex-foundry">
    <link rel="alternate" type="application/rss+xml" title="鲲鹏专区最新文章" href="https://www.oschina.net/groups/rss?ident=kunpeng">
    <link rel="alternate" type="application/rss+xml" title="openEuler最新文章" href="https://www.oschina.net/groups/rss?ident=openEuler">
    <link rel="alternate" type="application/rss+xml" title="信息安全最新文章" href="https://www.oschina.net/groups/rss?ident=cyber-security">
    <link rel="alternate" type="application/rss+xml" title="运维最新文章" href="https://www.oschina.net/groups/rss?ident=ops">
    <link rel="alternate" type="application/rss+xml" title="软件测试最新文章" href="https://www.oschina.net/groups/rss?ident=test">
    <link rel="alternate" type="application/rss+xml" title="网络技术最新文章" href="https://www.oschina.net/groups/rss?ident=network">
    <link rel="alternate" type="application/rss+xml" title="游戏开发最新文章" href="https://www.oschina.net/groups/rss?ident=game">
    <link rel="alternate" type="application/rss+xml" title="多媒体处理最新文章" href="https://www.oschina.net/groups/rss?ident=media">
    <link rel="alternate" type="application/rss+xml" title="DevOps最新文章" href="https://www.oschina.net/groups/rss?ident=devops">
    <link rel="alternate" type="application/rss+xml" title="区块链最新文章" href="https://www.oschina.net/groups/rss?ident=blockchain">

                                <script type="text/javascript" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/radarChart.js.下载"></script><script type="text/javascript" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/vue.min.js.下载"></script><style type="text/css">.MathJax_Preview {color: #888}
#MathJax_Message {position: fixed; left: 1em; bottom: 1.5em; background-color: #E6E6E6; border: 1px solid #959595; margin: 0px; padding: 2px 8px; z-index: 102; color: black; font-size: 80%; width: auto; white-space: nowrap}
#MathJax_MSIE_Frame {position: absolute; top: 0; left: 0; width: 0px; z-index: 101; border: 0px; margin: 0px; padding: 0px}
.MathJax_Error {color: #CC0000; font-style: italic}
</style><script type="text/javascript" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/jquery.caret.min.js.下载"></script><script type="text/javascript" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/jquery.atwho.min.js.下载"></script><style type="text/css">.MathJax_Hover_Frame {border-radius: .25em; -webkit-border-radius: .25em; -moz-border-radius: .25em; -khtml-border-radius: .25em; box-shadow: 0px 0px 15px #83A; -webkit-box-shadow: 0px 0px 15px #83A; -moz-box-shadow: 0px 0px 15px #83A; -khtml-box-shadow: 0px 0px 15px #83A; border: 1px solid #A6D ! important; display: inline-block; position: absolute}
.MathJax_Menu_Button .MathJax_Hover_Arrow {position: absolute; cursor: pointer; display: inline-block; border: 2px solid #AAA; border-radius: 4px; -webkit-border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; font-family: 'Courier New',Courier; font-size: 9px; color: #F0F0F0}
.MathJax_Menu_Button .MathJax_Hover_Arrow span {display: block; background-color: #AAA; border: 1px solid; border-radius: 3px; line-height: 0; padding: 4px}
.MathJax_Hover_Arrow:hover {color: white!important; border: 2px solid #CCC!important}
.MathJax_Hover_Arrow:hover span {background-color: #CCC!important}
</style><style type="text/css">#MathJax_Zoom {position: absolute; background-color: #F0F0F0; overflow: auto; display: block; z-index: 301; padding: .5em; border: 1px solid black; margin: 0; font-weight: normal; font-style: normal; text-align: left; text-indent: 0; text-transform: none; line-height: normal; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; box-shadow: 5px 5px 15px #AAAAAA; -webkit-box-shadow: 5px 5px 15px #AAAAAA; -moz-box-shadow: 5px 5px 15px #AAAAAA; -khtml-box-shadow: 5px 5px 15px #AAAAAA; filter: progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}
#MathJax_ZoomOverlay {position: absolute; left: 0; top: 0; z-index: 300; display: inline-block; width: 100%; height: 100%; border: 0; padding: 0; margin: 0; background-color: white; opacity: 0; filter: alpha(opacity=0)}
#MathJax_ZoomFrame {position: relative; display: inline-block; height: 0; width: 0}
#MathJax_ZoomEventTrap {position: absolute; left: 0; top: 0; z-index: 302; display: inline-block; border: 0; padding: 0; margin: 0; background-color: white; opacity: 0; filter: alpha(opacity=0)}
</style><style type="text/css">#MathJax_About {position: fixed; left: 50%; width: auto; text-align: center; border: 3px outset; padding: 1em 2em; background-color: #DDDDDD; color: black; cursor: default; font-family: message-box; font-size: 120%; font-style: normal; text-indent: 0; text-transform: none; line-height: normal; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; z-index: 201; border-radius: 15px; -webkit-border-radius: 15px; -moz-border-radius: 15px; -khtml-border-radius: 15px; box-shadow: 0px 10px 20px #808080; -webkit-box-shadow: 0px 10px 20px #808080; -moz-box-shadow: 0px 10px 20px #808080; -khtml-box-shadow: 0px 10px 20px #808080; filter: progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}
#MathJax_About.MathJax_MousePost {outline: none}
.MathJax_Menu {position: absolute; background-color: white; color: black; width: auto; padding: 2px; border: 1px solid #CCCCCC; margin: 0; cursor: default; font: menu; text-align: left; text-indent: 0; text-transform: none; line-height: normal; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; z-index: 201; box-shadow: 0px 10px 20px #808080; -webkit-box-shadow: 0px 10px 20px #808080; -moz-box-shadow: 0px 10px 20px #808080; -khtml-box-shadow: 0px 10px 20px #808080; filter: progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}
.MathJax_MenuItem {padding: 2px 2em; background: transparent}
.MathJax_MenuArrow {position: absolute; right: .5em; padding-top: .25em; color: #666666; font-size: .75em}
.MathJax_MenuActive .MathJax_MenuArrow {color: white}
.MathJax_MenuArrow.RTL {left: .5em; right: auto}
.MathJax_MenuCheck {position: absolute; left: .7em}
.MathJax_MenuCheck.RTL {right: .7em; left: auto}
.MathJax_MenuRadioCheck {position: absolute; left: 1em}
.MathJax_MenuRadioCheck.RTL {right: 1em; left: auto}
.MathJax_MenuLabel {padding: 2px 2em 4px 1.33em; font-style: italic}
.MathJax_MenuRule {border-top: 1px solid #CCCCCC; margin: 4px 1px 0px}
.MathJax_MenuDisabled {color: GrayText}
.MathJax_MenuActive {background-color: Highlight; color: HighlightText}
.MathJax_MenuDisabled:focus, .MathJax_MenuLabel:focus {background-color: #E8E8E8}
.MathJax_ContextMenu:focus {outline: none}
.MathJax_ContextMenu .MathJax_MenuItem:focus {outline: none}
#MathJax_AboutClose {top: .2em; right: .2em}
.MathJax_Menu .MathJax_MenuClose {top: -10px; left: -10px}
.MathJax_MenuClose {position: absolute; cursor: pointer; display: inline-block; border: 2px solid #AAA; border-radius: 18px; -webkit-border-radius: 18px; -moz-border-radius: 18px; -khtml-border-radius: 18px; font-family: 'Courier New',Courier; font-size: 24px; color: #F0F0F0}
.MathJax_MenuClose span {display: block; background-color: #AAA; border: 1.5px solid; border-radius: 18px; -webkit-border-radius: 18px; -moz-border-radius: 18px; -khtml-border-radius: 18px; line-height: 0; padding: 8px 0 6px}
.MathJax_MenuClose:hover {color: white!important; border: 2px solid #CCC!important}
.MathJax_MenuClose:hover span {background-color: #CCC!important}
.MathJax_MenuClose:hover:focus {outline: none}
</style><style type="text/css">.MathJax_Preview .MJXf-math {color: inherit!important}
</style><style type="text/css">.MJX_Assistive_MathML {position: absolute!important; top: 0; left: 0; clip: rect(1px, 1px, 1px, 1px); padding: 1px 0 0 0!important; border: 0!important; height: 1px!important; width: 1px!important; overflow: hidden!important; display: block!important; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none}
.MJX_Assistive_MathML.MJX_Assistive_MathML_Block {width: 100%!important}
</style></head><body class="osc-new-layout page-space-blog"><div id="MathJax_Message" style="display: none;"></div><svg aria-hidden="true" style="position: absolute; width: 0px; height: 0px; overflow: hidden;"><symbol id="oicon-icon-add-solid" viewBox="0 0 1024 1024"><path d="M921.6 0c56.32 0 102.4 46.08 102.4 102.4v819.2c0 56.32-46.08 102.4-102.4 102.4H102.4C46.08 1024 0 977.92 0 921.6V102.4C0 46.08 46.08 0 102.4 0h819.2z m-384 192h-51.2a26.24 26.24 0 0 0-25.6 25.6v226.112c0 10.24-6.848 17.088-17.088 17.088H217.6a26.24 26.24 0 0 0-25.6 25.6v51.2c0 13.632 11.968 25.6 25.6 25.6h226.112c10.24 0 17.088 6.848 17.088 17.088V806.4c0 13.632 11.968 25.6 25.6 25.6h51.2a26.24 26.24 0 0 0 25.6-25.6V580.288c0-10.24 6.848-17.088 17.088-17.088H806.4a26.24 26.24 0 0 0 25.6-25.6v-51.2a26.24 26.24 0 0 0-25.6-25.6H580.288c-10.24 0-17.088-6.848-17.088-17.088V217.6a26.24 26.24 0 0 0-25.6-25.6z"></path></symbol><symbol id="oicon-icon-right" viewBox="0 0 1024 1024"><path d="M848.969143 196.754286a36.571429 36.571429 0 0 1 61.074286 39.789714l-3.657143 5.485714-484.937143 615.789715-299.52-267.922286a36.571429 36.571429 0 0 1 43.446857-58.514286l5.266286 3.949714 241.517714 215.990858 436.809143-554.496z"></path></symbol><symbol id="oicon-icon-check-square" viewBox="0 0 1024 1024"><path d="M252.708571 73.142857h518.582858l9.801142 0.292572 12.726858 1.097142 9.508571 1.462858 14.628571 3.218285 14.336 4.534857a179.712 179.712 0 0 1 118.125715 156.086858l0.438857 12.873142v518.582858c0 15.286857-1.901714 30.061714-5.485714 44.251428l-2.998858 10.459429a180.150857 180.150857 0 0 1-96.256 108.544l-9.947428 4.242285a178.249143 178.249143 0 0 1-20.626286 6.582858l-10.752 2.340571c-7.241143 1.389714-14.628571 2.340571-22.089143 2.779429l-11.410285 0.365714h-518.582858a179.2 179.2 0 0 1-64.877714-12.068572l-9.947428-4.242285a180.297143 180.297143 0 0 1-92.672-98.377143l-3.584-10.24A179.2 179.2 0 0 1 73.142857 771.364571v-518.582857c0-73.435429 44.178286-136.630857 107.373714-164.425143l14.994286-5.851428 12.8-3.803429 6.070857-1.462857 13.165715-2.267428 5.632-0.731429 6.802285-0.585143c4.169143-0.292571 8.411429-0.438857 12.726857-0.438857z m528.237715 80.237714l-9.069715-0.438857H252.635429A99.986286 99.986286 0 0 0 152.868571 252.708571l0.073143 518.582858c0 51.638857 39.789714 94.427429 90.185143 99.328l9.581714 0.438857h518.582858c54.857143 0 99.766857-44.909714 99.766857-99.766857v-518.582858a100.059429 100.059429 0 0 0-90.112-99.328z"></path></symbol><symbol id="oicon-icon-phone" viewBox="0 0 1024 1024"><path d="M707.072 0H316.871111C236.088889 0 170.666667 62.407111 170.666667 139.662222v744.675556C170.666667 961.592889 236.032 1024 316.928 1024h390.144C787.911111 1024 853.333333 961.592889 853.333333 884.337778V139.662222C853.333333 62.407111 787.968 0 707.072 0z m-97.507556 930.929778H414.492444v-46.535111h195.072v46.535111z m158.435556-139.662222h-512V139.662222h512v651.605334z"></path></symbol><symbol id="oicon-export-all" viewBox="0 0 1024 1024"><path d="M852.114286 64v452.827429h-58.368V123.684571H154.112V900.388571h442.441143v59.684572H95.817143V64h756.297143zM783.798857 585.142857l144.018286 166.692572-143.725714 170.203428-44.178286-39.058286 81.700571-96.841142H595.968v-64h228.205714l-84.114285-97.426286 43.739428-39.497143z m-231.204571 36.352v64H217.746286v-64h334.848z m90.697143-185.782857v63.926857H217.819429v-64h425.618285z m88.356571-185.856v64H217.746286v-64h513.901714z"></path></symbol><symbol id="oicon-information-circle" viewBox="0 0 1024 1024"><path d="M563.2 358.4H460.8V256h102.4m0 512H460.8V460.8h102.4M512 0a512 512 0 1 0 0 1024A512 512 0 0 0 512 0z"></path></symbol><symbol id="oicon-oschina-circle" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 1 0 1024A512 512 0 0 1 512 0z m11.456 184.32c-200.576 0-339.136 139.008-339.136 327.552 0 167.68 130.56 334.976 334.464 327.552 223.936-8.32 300.416-205.248 300.416-205.248L621.44 568.96c0.448-0.96-40.128 65.792-118.016 65.792-68.16 0.448-123.648-44.032-127.36-126.976-3.776-77.376 64.384-129.28 129.216-130.624C579.84 375.168 624.64 460.48 624.64 460.48l192.64-70.912S737.92 184.32 523.456 184.32z"></path></symbol><symbol id="oicon-home-circle" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 1 0 1024A512 512 0 0 1 512 0z m-8.192 226.56L262.016 397.312A14.272 14.272 0 0 0 256 408.96v312.896a14.208 14.208 0 0 0 14.208 14.208h156.48c7.808 0 14.208-6.4 14.208-14.208V551.04H583.04v170.688c0 7.872 6.4 14.208 14.208 14.208h156.48c7.872 0 14.208-6.4 14.208-14.208v-312.96a14.272 14.272 0 0 0-6.016-11.52L520.192 226.56a14.208 14.208 0 0 0-16.384 0z"></path></symbol><symbol id="oicon-balance" viewBox="0 0 1024 1024"><path d="M935.936 538.304l-128.512-271.04h50.88c0.32-1.536 0.96-3.008 0.96-4.544 0-36.608-105.92-67.456-250.88-77.248-11.264-27.968-50.368-48.64-97.024-48.64-46.528 0-85.632 20.672-96.96 48.64-145.472 9.6-251.904 40.576-251.904 77.248 0 1.536 0.64 3.008 0.96 4.48h61.12L96.064 538.368H62.592c0 44.352 78.784 80.256 176 80.256 97.28 0 176-35.904 176-80.256H390.4L261.76 267.264h207.36l-35.904 535.168c-70.656 11.008-122.176 44.864-122.176 85.12h400.512c0-40.256-51.456-74.112-122.112-85.12l-35.84-535.168h216.512L641.6 538.24h-33.408c0 44.352 78.72 80.256 176 80.256 97.216 0 176-35.904 176-80.256h-24.256z m-587.52 0H138.048L243.2 316.416 348.48 538.24z m335.104 0l105.28-221.888 105.216 221.888H683.52z"></path></symbol><symbol id="oicon-readme" viewBox="0 0 1024 1024"><path d="M885.76 192h-217.408c-74.88 0-139.84 50.88-156.16 122.688C495.616 242.88 430.72 192 355.968 192H138.624C97.472 192 64 224.832 64 265.344v439.552c0 40.448 33.472 73.28 74.688 73.28h139.52c158.976 0 206.4 37.312 229.12 114.56 1.088 4.352 8.064 4.352 9.344 0 22.848-77.248 70.336-114.56 229.12-114.56h139.52c41.216 0 74.688-32.832 74.688-73.28V265.472c0-40.32-33.152-73.152-74.24-73.472zM435.072 602.88H185.6a5.376 5.376 0 0 1-5.44-5.376v-35.008c0-2.88 2.304-5.376 5.44-5.376h249.472c2.944 0 5.44 2.304 5.44 5.376v35.008a5.632 5.632 0 0 1-5.568 5.312z m0-93.12H185.6a5.376 5.376 0 0 1-5.44-5.312v-35.008c0-2.88 2.304-5.312 5.44-5.312h249.472c2.944 0 5.44 2.24 5.44 5.312v35.008a5.632 5.632 0 0 1-5.568 5.312z m0-92.992H185.6a5.376 5.376 0 0 1-5.44-5.376v-35.008c0-2.88 2.304-5.312 5.44-5.312h249.472c2.944 0 5.44 2.304 5.44 5.312v35.008a5.632 5.632 0 0 1-5.568 5.376z m403.328 185.92H588.992a5.376 5.376 0 0 1-5.44-5.376v-34.944c0-2.944 2.368-5.376 5.44-5.376h249.536c2.944 0 5.44 2.304 5.44 5.376v34.944a5.632 5.632 0 0 1-5.632 5.376z m0-93.056H588.992a5.376 5.376 0 0 1-5.44-5.376v-34.944c0-2.944 2.368-5.376 5.44-5.376h249.536c2.944 0 5.44 2.304 5.44 5.376v34.944a5.632 5.632 0 0 1-5.632 5.376z m0-93.056H588.992a5.376 5.376 0 0 1-5.44-5.312V376.32c0-2.88 2.368-5.312 5.44-5.312h249.536c2.944 0 5.44 2.304 5.44 5.312v34.88a5.632 5.632 0 0 1-5.632 5.312z"></path></symbol><symbol id="oicon-arrow-down-light" viewBox="0 0 1024 1024"><path d="M755.2 393.6c-12.8-12.8-38.4-12.8-51.2 0L512 589.888 320 393.6c-12.8-12.8-38.4-12.8-51.2 0-12.8 12.8-12.8 38.4 0 51.2l217.6 226.112c12.8 12.8 38.4 12.8 51.2 0l217.6-226.112c17.088-17.088 17.088-38.4 0-51.2z"></path></symbol><symbol id="oicon-flag" viewBox="0 0 1024 1024"><path d="M864.8704 132.3008C780.6976 204.8 643.754667 204.868267 559.5136 132.3008 423.389867 15.086933 202.069333 15.086933 65.9456 132.3008a53.589333 53.589333 0 0 0-19.524267 40.618667v746.154666c0 31.675733 29.764267 57.344 66.56 57.344 36.864 0 66.56-25.668267 66.56-57.344V657.749333c84.650667-57.275733 207.803733-52.360533 285.832534 14.882134 136.192 117.282133 357.5808 117.282133 493.568 0a53.6576 53.6576 0 0 0 19.524266-40.5504V172.919467c0-23.210667-16.247467-44.168533-41.028266-53.0432a74.5472 74.5472 0 0 0-72.567467 12.424533z"></path></symbol><symbol id="oicon-book" viewBox="0 0 1024 1024"><path d="M853.430857 73.142857H268.141714a146.285714 146.285714 0 0 0-146.358857 146.285714v585.142858a146.285714 146.285714 0 0 0 146.285714 146.285714h585.362286a48.786286 48.786286 0 0 0 48.786286-48.786286V121.929143A48.786286 48.786286 0 0 0 853.430857 73.142857zM268.141714 853.357714a48.786286 48.786286 0 1 1 0-97.572571H804.571429v97.572571H268.141714z"></path></symbol><symbol id="oicon-refresh" viewBox="0 0 1024 1024"><path d="M512.32 931.392a417.28 417.28 0 0 1-268.48-97.28 419.328 419.328 0 0 1-143.232-242.368l71.424-13.76a346.816 346.816 0 0 0 660.928 65.792l67.392 27.648a419.136 419.136 0 0 1-388.032 259.968z m334.528-509.952a349.312 349.312 0 0 0-122.24-183.296 342.912 342.912 0 0 0-212.288-72.704 344.192 344.192 0 0 0-194.88 59.968 347.52 347.52 0 0 0-125.632 154.624l-67.328-27.776a418.816 418.816 0 0 1 151.744-186.88A417.152 417.152 0 0 1 512.256 92.8a417.728 417.728 0 0 1 256.896 87.936 421.12 421.12 0 0 1 91.52 98.112c25.408 37.952 44.416 79.616 56.32 123.648l-70.144 19.008z"></path><path d="M30.272 669.376l93.504-162.56 162.56 93.44M997.76 345.28L914.432 513.28l-168.192-83.2"></path></symbol><symbol id="oicon-mail-light" viewBox="0 0 1024 1024"><path d="M877.714286 97.28c80.457143 0 146.285714 65.828571 146.285714 146.285714v536.356572c0 80.457143-65.828571 146.285714-146.285714 146.285714H146.285714c-80.457143 0-146.285714-65.828571-146.285714-146.285714V243.565714c0-80.457143 65.828571-146.285714 146.285714-146.285714h731.428572z m48.713143 221.842286l-387.657143 258.486857c-7.314286 4.827429-17.042286 7.314286-26.770286 7.314286a49.152 49.152 0 0 1-26.843429-7.314286l-387.657142-258.486857v460.8c0 26.843429 21.942857 48.786286 48.786285 48.786285h731.428572c26.843429 0 48.786286-21.942857 48.786285-48.786285l-0.073142-460.8zM877.714286 194.779429H146.285714a48.64 48.64 0 0 0-35.035428 14.921142L512 477.622857l400.749714-267.922286A48.64 48.64 0 0 0 877.714286 194.779429z"></path></symbol><symbol id="oicon-heart-light" viewBox="0 0 1024 1024"><path d="M707.510857 123.977143c-58.953143 5.558857-112.64 48.859429-156.013714 110.518857l-9.069714 13.531429-30.427429 46.811428-30.427429-46.811428c-47.835429-73.508571-109.568-124.635429-177.737142-124.635429C177.078857 123.392 72.411429 238.884571 72.411429 382.537143c0 65.536 47.177143 165.083429 107.081142 220.16 72.996571 93.403429 315.245714 297.984 333.312 297.984 18.724571 0 255.780571-200.996571 334.336-301.129143 56.758857-51.492571 104.301714-151.259429 104.301715-217.014857 0-138.752-97.792-251.318857-218.697143-258.706286l-12.580572-0.365714-12.726857 0.585143z m27.501714-72.411429C896.438857 60.050286 1024 205.897143 1024 382.537143c0 86.820571-56.612571 205.677714-123.684571 265.801143-88.283429 113.590857-337.188571 324.534857-387.437715 324.534857-49.590857 0-303.542857-214.528-386.267428-321.316572C56.246857 587.702857 0 468.992 0 382.537143 0 200.557714 135.314286 51.2 303.762286 51.2c78.628571 0 144.457143 40.813714 198.217143 103.277714L512 166.546286l10.020571-11.995429C572.050286 96.182857 632.832 56.758857 704.658286 51.712L720.237714 51.2l14.774857 0.365714z"></path></symbol><symbol id="oicon-heart-bold" viewBox="0 0 1024 1024"><path d="M735.012571 51.565714C896.438857 60.050286 1024 205.897143 1024 382.537143c0 86.820571-56.612571 205.677714-123.684571 265.801143-88.283429 113.590857-337.188571 324.534857-387.437715 324.534857-49.590857 0-303.542857-214.528-386.267428-321.316572C56.246857 587.702857 0 468.992 0 382.537143 0 200.557714 135.314286 51.2 303.762286 51.2c78.628571 0 144.457143 40.813714 198.217143 103.277714L512 166.546286l10.020571-11.995429C572.050286 96.182857 632.832 56.758857 704.658286 51.712L720.237714 51.2l14.774857 0.365714z"></path></symbol><symbol id="oicon-box" viewBox="0 0 1024 1024"><path d="M950.857143 725.504c0 15.798857-11.995429 35.547429-23.917714 43.52l-386.998858 209.481143a48.274286 48.274286 0 0 1-55.881142 0l-386.925715-209.481143C85.065143 761.051429 73.142857 741.302857 73.142857 725.504V298.422857c0-15.798857 11.995429-35.547429 23.917714-43.52L484.059429 45.494857a48.274286 48.274286 0 0 1 55.881142 0l386.925715 209.481143c11.995429 7.972571 23.990857 27.721143 23.990857 43.52V725.577143m-438.857143-585.142857L220.745143 298.422857 512 456.630857l291.254857-158.134857L512 140.434286z"></path></symbol><symbol id="oicon-comment-light" viewBox="0 0 1024 1024"><path d="M512.129463 36.571429C229.505463 36.571429 0.348891 234.203429 0.348891 478.061714c0 101.010286 39.789714 193.536 105.764572 268.068572C76.271177 829.732571 14.246034 900.608 13.295177 901.485714c-13.165714 14.848-16.822857 36.498286-9.216 55.149715 7.606857 18.724571 25.014857 30.793143 44.178286 30.793142 122.953143 0 219.940571-54.564571 278.162286-98.304 57.782857 19.382857 120.173714 30.354286 185.782857 30.354286C794.972891 919.478857 1024.129463 721.92 1024.129463 478.061714S794.972891 36.571429 512.129463 36.571429z m0 781.092571c-53.394286 0-106.057143-8.777143-156.745143-25.746286l-45.348571-15.213714-38.985143 29.257143a421.302857 421.302857 0 0 1-114.980572 61.513143c14.628571-25.6 28.745143-54.491429 39.789715-85.284572l21.211428-59.611428-41.252571-46.299429c-36.205714-40.96-79.579429-108.690286-79.579429-198.217143 0-187.245714 186.587429-339.602286 415.963429-339.602285s415.963429 152.356571 415.963428 339.602285c0 187.245714-186.587429 339.602286-415.963428 339.602286z"></path></symbol><symbol id="oicon-noanswer" viewBox="0 0 1024 1024"><path d="M511.122286 36.571429C793.965714 36.571429 1022.317714 248.832 1024 512c0 263.168-228.278857 475.428571-511.122286 475.428571a530.797714 530.797714 0 0 1-269.165714-71.314285 34.450286 34.450286 0 0 0-29.037714-3.364572l-149.942857 52.662857c-27.282286 8.411429-52.809143-15.36-44.251429-42.496l47.689143-151.113142a31.158857 31.158857 0 0 0-3.437714-27.209143A454.948571 454.948571 0 0 1 0 512C0 248.832 228.278857 36.571429 511.122286 36.571429z m-159.451429 257.316571a14.628571 14.628571 0 0 0-20.699428 0l-51.712 51.712a14.628571 14.628571 0 0 0 0 20.699429l160.256 160.256-160.256 160.402285-2.706286 3.803429a14.628571 14.628571 0 0 0 2.706286 16.822857l51.712 51.785143 3.803428 2.706286a14.628571 14.628571 0 0 0 16.896-2.706286l160.256-160.402286 160.402286 160.402286a14.628571 14.628571 0 0 0 20.699428 0l51.712-51.712a14.628571 14.628571 0 0 0 0-20.699429L584.338286 526.555429l160.402285-160.256 2.706286-3.803429a14.628571 14.628571 0 0 0-2.706286-16.822857l-51.712-51.785143-3.803428-2.706286a14.628571 14.628571 0 0 0-16.896 2.706286L511.926857 454.144 351.670857 293.888z"></path></symbol><symbol id="oicon-pen" viewBox="0 0 1024 1024"><path d="M581.491566 186.514286l256 256-555.885715 556.032-228.352 25.161143a47.981714 47.981714 0 0 1-52.955428-53.028572l25.380571-228.425143L581.491566 186.514286z m414.354285-38.180572L875.672137 28.16a96.036571 96.036571 0 0 0-135.826286 0L626.766994 141.165714l256 256 113.078857-113.078857a96.036571 96.036571 0 0 0 0-135.826286z"></path></symbol><symbol id="oicon-share" viewBox="0 0 1024 1024"><path d="M1024 455.111111l-398.222222-398.222222v227.555555C227.555556 341.333333 56.888889 625.777778 0 910.222222c142.222222-199.111111 341.333333-290.133333 625.777778-290.133333V853.333333l398.222222-398.222222z"></path></symbol><symbol id="oicon-star" viewBox="0 0 1024 1024"><path d="M1024 403.228444c0 8.931556-5.347556 18.659556-15.985778 29.240889l-223.402666 215.722667 52.906666 304.696889c0.455111 2.844444 0.625778 6.940444 0.625778 12.174222 0 8.533333-2.161778 15.758222-6.428444 21.617778a21.788444 21.788444 0 0 1-18.773334 8.874667 50.119111 50.119111 0 0 1-24.632889-7.338667L512 844.401778l-276.309333 143.815111a52.679111 52.679111 0 0 1-24.632889 7.338667c-8.590222 0-15.075556-2.958222-19.342222-8.817778a35.669333 35.669333 0 0 1-6.485334-21.617778c0-2.446222 0.398222-6.542222 1.251556-12.231111l52.906666-304.696889L15.36 432.469333C5.12 421.546667 0 411.761778 0 403.228444c0-15.018667 11.491556-24.405333 34.474667-28.046222l308.906666-44.487111L481.848889 53.475556C489.642667 36.750222 499.712 28.444444 512 28.444444c12.288 0 22.357333 8.305778 30.151111 25.031112l138.467556 277.219555 308.906666 44.487111c22.983111 3.640889 34.474667 13.027556 34.474667 28.046222z"></path></symbol><symbol id="oicon-thumb-up" viewBox="0 0 1024 1024"><path d="M978.659556 554.211556l-126.634667 291.157333c-19.285333 31.118222-46.648889 46.648889-82.204445 46.648889H385.365333c-29.582222 0-55.580444-11.093333-77.767111-33.336889-22.186667-22.186667-33.336889-48.128-33.336889-77.767111V409.770667c0-26.680889 9.614222-49.607111 28.842667-68.835556L607.573333 38.684444l20.024889 22.186667c17.749333 17.863111 31.857778 37.091556 42.211556 57.856 4.494222 10.353778 5.973333 20.707556 4.494222 31.061333l-44.487111 220.046223h262.200889c25.201778 0 47.047111 9.614222 65.536 28.842666 18.545778 19.285333 27.818667 41.528889 27.818666 66.673778v51.086222c0 13.368889-2.275556 25.941333-6.712888 37.831111zM38.684444 892.017778V369.777778h93.297778c13.368889 0 24.860444 4.437333 34.531556 13.312 9.671111 8.874667 14.449778 20.024889 14.449778 33.336889v426.666666a47.047111 47.047111 0 0 1-14.449778 34.474667 47.047111 47.047111 0 0 1-34.474667 14.449778H38.684444z"></path></symbol><symbol id="oicon-quick-download" viewBox="0 0 1024 1024"><path d="M1023.99616 780.288914v200.703247c0 23.807911-21.37592 43.007839-47.99982 43.007839H47.99982c-26.6239 0-47.99982-19.199928-47.99982-43.007839v-200.703247c0-23.807911 21.37592-43.007839 47.99982-43.007839H326.398776v88.831667c0 72.06373 96.959636 72.06373 143.807461 10.879959l87.487672-99.711626h418.302431c26.6239 0 47.99982 19.199928 47.99982 43.007839z m-247.99907 157.695409c0-19.711926-17.983933-35.839866-39.99985-35.839866s-39.99985 16.12794-39.99985 35.839866c0 19.711926 17.983933 35.839866 39.99985 35.839865s39.99985-16.12794 39.99985-35.839865z m127.99952 0c0-19.711926-17.983933-35.839866-39.99985-35.839866s-39.99985 16.12794-39.99985 35.839866c0 19.711926 17.983933 35.839866 39.99985 35.839865s39.99985-16.12794 39.99985-35.839865zM801.724994 224.258999c8.575968 6.847974 10.239962 14.335946 4.991981 22.527916L421.118421 839.168693c-6.143977 8.511968-16.191939 12.799952-29.951888 12.799952-1.919993 0-5.24798-0.319999-9.983962-1.023996a31.487882 31.487882 0 0 1-18.239932-9.727964 14.847944 14.847944 0 0 1-3.199988-15.359942L500.414123 412.162294l-289.918912 51.711806a52.671802 52.671802 0 0 1-8.575968 0.511999 41.855843 41.855843 0 0 1-22.143917-5.631979c-8.575968-5.119981-11.647956-11.775956-9.279965-19.967925l143.551461-422.398416a23.551912 23.551912 0 0 1 11.391958-11.775956A41.599844 41.599844 0 0 1 345.470704 0.00384h234.239122c8.959966 0 16.639938 2.111992 22.783915 6.399976 6.207977 4.287984 9.279965 9.279965 9.279965 15.103943a16.639938 16.639938 0 0 1-3.519987 9.215966L486.142177 267.778836l282.75094-50.175812a40.639848 40.639848 0 0 1 32.831877 6.655975z"></path></symbol><symbol id="oicon-money-bold" viewBox="0 0 1024 1024"><path d="M404.668555 802.966617H181.92879c-20.760984-1.535744-36.744098-10.295173-47.892463-26.278287A115.123924 115.123924 0 0 1 113.844137 723.562962c2.275176-19.452758 9.043826-35.435872 20.19219-47.892463 11.148364-12.51347 27.131478-19.509637 47.892463-21.045381h222.739765v-73.658835l-222.739765-1.137588c-20.760984-1.592623-36.744098-8.986947-47.892463-22.182969-11.148364-13.309782-17.860134-30.032328-20.19219-50.281398 2.275176-19.509637 9.043826-35.435872 20.19219-47.949342 11.148364-12.456591 27.131478-19.452758 47.892463-21.045381H348.187302L193.47531 162.504471a176.212409 176.212409 0 0 1-21.955452-35.663389 97.491307 97.491307 0 0 1-9.214464-47.323668c3.8678-21.784814 11.54652-39.531189 23.09304-53.182248C196.944954 12.684108 218.50225 3.924679 250.013442 0.056879c18.485808 1.535744 35.037716 7.963117 49.655724 19.28212s26.505805 23.548075 35.777149 36.800978L510.862412 381.14892 703.569849 53.807921c9.214464-13.252902 21.15914-24.913181 35.834028-35.037716 14.561129-10.124535 31.113037-16.38127 49.598845-18.713326 11.489641 0.796312 22.069211 2.332056 31.73871 4.664112 9.61262 2.332056 18.030773 6.256735 25.368216 11.717158 7.280564 5.460423 13.48042 13.252902 18.485808 23.320558 4.948509 10.181414 8.64567 23.434317 10.920847 39.815586 0 22.581125-7.67872 43.967783-23.036161 64.273732L673.537522 438.255846h169.614397c20.021552 1.592623 35.834028 8.588791 47.323668 21.045382 11.54652 12.51347 18.087652 28.439704 19.623397 47.949341a87.366772 87.366772 0 0 1-20.192191 51.418986c-11.944676 13.992335-27.87091 21.784814-47.892462 23.320558l-220.40771 1.194467v71.326779h221.545298c20.021552 1.535744 35.834028 9.328223 47.323668 23.320558 11.54652 14.049214 18.087652 30.82864 19.623397 50.281397a86.57046 86.57046 0 0 1-19.623397 50.850192c-11.54652 13.651058-27.302116 21.21602-47.323668 22.751764l-221.545298-1.137589v123.883353C618.535133 990.782425 582.757985 1023.886241 514.275176 1023.886241c-33.900128 0-60.235294-8.190635-79.062378-24.571905-18.883964-16.32439-29.008499-41.294451-30.601122-74.796422v-121.551297z"></path></symbol><symbol id="oicon-document" viewBox="0 0 1024 1024"><path d="M924.14712 375.508265h-250.87216c-59.134152 0-107.51664-46.07856-107.51664-102.3968V34.142933A35.134902 35.134902 0 0 0 529.91944 0.031999h-358.3888C112.396488 0.031999 64.014 46.110559 64.014 102.428799v819.174401c0 56.31824 48.382488 102.3968 107.51664 102.3968h680.93872c59.134152 0 107.51664-46.07856 107.51664-102.3968v-511.984001a35.134902 35.134902 0 0 0-35.83888-34.110934z m28.671104-143.35552L716.281616 6.879785a23.67926 23.67926 0 0 0-17.91944-6.847786c-14.335552 0-25.087216 10.23968-25.087216 23.871254V204.825599c0 37.566826 32.254992 68.285866 71.67776 68.285866h189.946064c14.335552 0 25.087216-10.23968 25.087216-23.935252a21.375332 21.375332 0 0 0-7.167776-17.023468z"></path></symbol><symbol id="oicon-download" viewBox="0 0 1024 1024"><path d="M432 0h160c26.624 0 48 21.376 48 48V384h175.36c35.648 0 53.44 43.008 28.224 68.224l-304.192 304.384a38.72 38.72 0 0 1-54.592 0l-304.64-304.384A39.936 39.936 0 0 1 208.448 384H384V48c0-26.624 21.376-48 48-48zM1024 752v224c0 26.624-21.376 48-48 48H48a47.872 47.872 0 0 1-48-48v-224c0-26.624 21.376-48 48-48h293.376l98.048 97.984c40.192 40.192 104.96 40.192 145.152 0L682.624 704h293.376c26.624 0 48 21.376 48 48z m-248 176a40.128 40.128 0 0 0-40-40 40.128 40.128 0 0 0-40 40c0 22.016 17.984 40 40 40a40.128 40.128 0 0 0 40-40z m128 0a40.128 40.128 0 0 0-40-40 40.128 40.128 0 0 0-40 40c0 22.016 17.984 40 40 40a40.128 40.128 0 0 0 40-40z"></path></symbol><symbol id="oicon-home" viewBox="0 0 1024 1024"><path d="M54.3966 280.174489L482.465846 8.63946a55.03656 55.03656 0 0 1 59.260296 0L969.539404 280.302481c33.789888 21.502656 54.3966 59.708268 54.3966 100.857696v524.639211c0 65.27592-50.940816 118.200612-113.784888 118.200612H113.784888C50.940816 1023.936004 0 971.011312 0 905.735392V381.096181c0-41.213424 20.606712-79.35504 54.3966-100.921692z m343.786514 270.959065c-31.35804 0-56.892444 26.494344-56.892445 59.132304v177.268921c0 32.63796 25.470408 59.132304 56.956441 59.132304h227.50578c31.35804 0 56.892444-26.494344 56.892445-59.132304v-177.268921c0-32.63796-25.470408-59.132304-56.956441-59.132304H398.24711z"></path></symbol><symbol id="oicon-edit" viewBox="0 0 1024 1024"><path d="M736.768 938.666667h-534.755556c-64.284444 0-116.679111-53.930667-116.679111-120.206223V267.719111c0-66.275556 52.337778-120.206222 116.679111-120.206222h124.700445c21.560889 0 39.025778 17.976889 39.025778 40.163555 0 22.186667-17.464889 40.163556-39.025778 40.163556H202.012444a39.310222 39.310222 0 0 0-38.684444 39.822222v550.798222c0 22.016 17.351111 39.822222 38.684444 39.822223h534.755556c21.333333 0 38.684444-17.806222 38.684444-39.822223v-121.514666c0-22.186667 17.464889-40.163556 39.025778-40.163556 21.560889 0 38.968889 17.976889 38.968889 40.163556v121.514666c0 66.275556-52.337778 120.206222-116.622222 120.206223z m-353.848889-205.937778c-18.773333 0-36.807111-7.395556-50.460444-21.504a75.320889 75.320889 0 0 1-17.635556-74.126222l25.827556-168.789334a42.439111 42.439111 0 0 1 1.877333-7.509333 232.163556 232.163556 0 0 1 51.939556-83.740444l248.604444-256.056889c22.186667-22.926222 52.565333-35.84 83.171556-35.669334 29.127111 0.227556 56.149333 11.946667 76.060444 32.995556l106.382222 112.696889c20.48 21.731556 31.061333 50.801778 29.866667 81.749333a121.912889 121.912889 0 0 1-34.474667 80.156445l-247.125333 254.407111a223.800889 223.800889 0 0 1-81.351111 53.532444 35.669333 35.669333 0 0 1-7.281778 1.934222l-163.896889 26.624a72.931556 72.931556 0 0 1-21.560889 3.299556z m34.133333-247.921778l-25.201777 165.262222 160.426666-25.998222c18.375111-7.395556 35.441778-19.000889 49.550223-33.564444l247.068444-254.407111c14.051556-14.506667 15.758222-36.465778 3.868444-49.152l-106.382222-112.526223a28.330667 28.330667 0 0 0-20.650666-8.760889 38.115556 38.115556 0 0 0-27.477334 12.174223l-248.604444 256a149.788444 149.788444 0 0 0-32.540445 50.972444z"></path></symbol><symbol id="oicon-rise" viewBox="0 0 1024 1024"><path d="M1024 166.034286v268.726857a18.505143 18.505143 0 0 1-11.702857 18.285714c-7.899429 3.437714-15.067429 1.901714-21.504-4.681143l-73.069714-74.752-382.244572 391.094857a18.578286 18.578286 0 0 1-27.794286 0L367.177143 620.690286 115.931429 877.714286 0 759.076571l353.206857-361.325714a18.944 18.944 0 0 1 13.897143-6.217143c5.266286 0 9.874286 2.048 13.897143 6.144l140.653714 143.945143 280.137143-286.646857-72.996571-74.752c-6.436571-6.582857-8.045714-13.897143-4.534858-21.942857A17.993143 17.993143 0 0 1 742.034286 146.285714h262.582857c5.705143 0 10.24 1.828571 13.897143 5.558857 3.657143 3.657143 5.485714 8.411429 5.485714 14.189715z"></path></symbol><symbol id="oicon-application" viewBox="0 0 1024 1024"><path d="M928 605.952v270.848a51.2 51.2 0 0 1-51.2 51.2h-270.848a51.2 51.2 0 0 1-51.2-51.2v-270.848a51.2 51.2 0 0 1 51.2-51.2h270.848a51.2 51.2 0 0 1 51.2 51.2z m-458.752 0v270.848a51.2 51.2 0 0 1-51.2 51.2H147.2a51.2 51.2 0 0 1-51.2-51.2v-270.848a51.2 51.2 0 0 1 51.2-51.2h270.848a51.2 51.2 0 0 1 51.2 51.2zM928 147.2v270.848a51.2 51.2 0 0 1-51.2 51.2h-270.848a51.2 51.2 0 0 1-51.2-51.2V147.2a51.2 51.2 0 0 1 51.2-51.2h270.848a51.2 51.2 0 0 1 51.2 51.2z m-458.752 0v270.848a51.2 51.2 0 0 1-51.2 51.2H147.2a51.2 51.2 0 0 1-51.2-51.2V147.2a51.2 51.2 0 0 1 51.2-51.2h270.848a51.2 51.2 0 0 1 51.2 51.2z"></path></symbol><symbol id="oicon-ranking" viewBox="0 0 1024 1024"><path d="M511.780571 185.051429l-62.244571 46.08 23.625143-74.24-62.244572-46.08h77.238858L511.780571 36.571429l23.625143 74.24h77.238857L550.4 156.891429l23.625143 74.24-62.244572-46.08z m-284.416 314.441142l-62.208 45.165715 24.064-73.764572-62.683428-46.08H203.702857l28.16-74.24 19.565714 74.24h77.238858l-62.72 46.08 24.100571 73.764572-62.72-45.165715z m567.442286-111.140571l-62.683428 46.116571 24.064-74.678857-62.683429-46.116571h77.238857l10.422857-74.678857 37.266286 74.678857h77.238857l-62.244571 46.08 23.625143 74.715428-62.244572-46.08z m-218.989714-101.412571h-127.195429c-29.988571 0-54.491429 24.868571-54.491428 55.332571v553.252571c0 30.427429 24.502857 55.332571 54.491428 55.332572h127.195429c29.988571 0 54.528-24.868571 54.528-55.332572V342.308571c0-30.902857-24.502857-55.332571-54.491429-55.332571zM291.474286 618.422857H164.205714c-29.988571 0-54.528 24.905143-54.528 55.332572v221.330285c0 30.427429 24.502857 55.296 54.491429 55.296H291.474286c29.988571 0 54.491429-24.868571 54.491428-55.296v-221.330285c0-30.427429-24.502857-55.332571-54.491428-55.332572z m568.32-110.189714h-127.195429c-29.988571 0-54.491429 24.868571-54.491428 55.332571v331.958857c0 30.427429 24.502857 55.332571 54.491428 55.332572h127.195429c29.988571 0 54.528-24.868571 54.528-55.332572V563.565714c0-30.902857-24.502857-55.332571-54.491429-55.332571z"></path></symbol><symbol id="oicon-information" viewBox="0 0 1024 1024"><path d="M766.683429 821.686857V194.304a111.908571 111.908571 0 0 0-111.177143-112.384H198.217143a111.908571 111.908571 0 0 0-111.177143 112.384v635.282286a111.908571 111.908571 0 0 0 111.177143 112.420571h569.197714V821.76l-0.731428-0.109714zM242.395429 302.116571h49.664V251.904a34.011429 34.011429 0 1 1 68.022857 0V302.08h49.700571a34.377143 34.377143 0 0 1 0 68.754286H360.118857v50.212571a34.011429 34.011429 0 1 1-68.022857 0V370.834286H242.358857a34.377143 34.377143 0 0 1 0-68.754286z m355.474285 501.723429h-355.474285a34.377143 34.377143 0 0 1 0-68.754286h355.474285a34.377143 34.377143 0 0 1 0 68.754286z m0-151.478857H347.940571a34.377143 34.377143 0 0 1 0-68.754286h249.929143a34.377143 34.377143 0 0 1 0 68.754286z m0-154.477714h-120.027428a34.377143 34.377143 0 0 1 0-68.754286h120.027428a34.377143 34.377143 0 0 1 0 68.754286z m266.496-116.370286h-41.325714V942.08h5.193143v-0.512a120.100571 120.100571 0 0 0 108.726857-119.954286V454.948571c0.219429-40.338286-32.292571-73.179429-72.594286-73.398857z"></path></symbol><symbol id="oicon-add" viewBox="0 0 1024 1024"><path d="M590.72 571.072h260.992a30.272 30.272 0 0 0 29.504-29.504v-59.136a30.272 30.272 0 0 0-29.504-29.504H590.72c-11.84 0-19.712-7.872-19.712-19.712V172.288a30.272 30.272 0 0 0-29.504-29.504h-59.136a30.272 30.272 0 0 0-29.504 29.504V433.28c0 11.84-7.872 19.712-19.712 19.712H172.288a30.272 30.272 0 0 0-29.504 29.504v59.136c0 15.744 13.76 29.504 29.504 29.504H433.28c11.84 0 19.712 7.872 19.712 19.712v260.928c0 15.744 13.76 29.504 29.504 29.504h59.136a30.272 30.272 0 0 0 29.504-29.504V590.72c0-11.84 7.872-19.712 19.712-19.712z"></path></symbol><symbol id="oicon-app" viewBox="0 0 1024 1024"><path d="M471.779556 10.808889c25.031111-14.392889 55.409778-14.392889 80.440888 0l371.939556 213.560889c26.510222 15.189333 42.951111 44.145778 42.951111 75.605333v424.049778c0 31.402667-16.497778 60.359111-42.951111 75.548444l-371.939556 213.674667c-25.031111 14.336-55.409778 14.336-80.440888 0l-371.939556-213.617778A86.983111 86.983111 0 0 1 56.888889 723.968V300.032c0-31.402667 16.497778-60.302222 42.951111-75.491556L471.779556 10.752zM217.201778 342.698667a44.657778 44.657778 0 0 0-3.584 32.824889 42.894222 42.894222 0 0 0 19.797333 25.884444L470.471111 537.486222v271.36c0 23.893333 18.602667 43.235556 41.528889 43.235556 22.926222 0 41.528889-19.342222 41.528889-43.235556v-271.36l237.056-136.192a44.145778 44.145778 0 0 0 14.961778-57.856 40.789333 40.789333 0 0 0-55.182223-17.635555L512 462.677333 273.635556 325.802667a40.732444 40.732444 0 0 0-56.433778 16.896z"></path></symbol><symbol id="oicon-time" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 1 0 1024A512 512 0 0 1 512 0z m51.2 204.8H460.8v358.4l179.2 179.2L716.8 665.6 563.2 512V204.8z"></path></symbol><symbol id="oicon-comment" viewBox="0 0 1024 1024"><path d="M512 113.777778C260.664889 113.777778 56.888889 275.911111 56.888889 475.932444c0 83.057778 35.100444 159.516444 94.151111 220.615112l-0.227556 1.365333-22.983111 120.32a29.752889 29.752889 0 0 0 39.196445 33.393778l116.679111-40.448 28.387555-9.841778A551.139556 551.139556 0 0 0 512 837.973333c251.335111 0 455.111111-162.133333 455.111111-362.097777C967.111111 275.911111 763.335111 113.777778 512 113.777778z"></path></symbol><symbol id="oicon-admin" viewBox="0 0 1024 1024"><path d="M575.658667 940.032l15.303111-88.405333-64.682667-62.634667c-22.414222-21.617778-30.435556-50.744889-21.560889-77.824 8.931556-27.079111 32.597333-45.795556 63.431111-50.232889l78.222223-11.320889c-3.413333-2.275556-6.428444-4.551111-9.272889-7.054222a81.180444 81.180444 0 0 1-21.048889-26.737778 77.482667 77.482667 0 0 1-7.281778-27.932444c-0.568889-9.386667 0-18.602667 1.763556-27.591111a76.8 76.8 0 0 1 5.575111-18.602667 43.121778 43.121778 0 0 1 9.102222-13.084444 85.333333 85.333333 0 0 1 12.8-10.24c4.949333-3.413333 9.955556-7.281778 15.473778-12.231112 4.835556-4.209778 9.102222-10.069333 13.198222-17.635555 3.754667-7.452444 7.281778-15.246222 10.353778-23.04a320.284444 320.284444 0 0 0 8.192-27.932445 44.145778 44.145778 0 0 0 17.294222-9.898666c4.778667-4.266667 9.102222-10.069333 13.141333-17.692445 3.754667-7.623111 6.826667-17.521778 8.533334-30.264889 1.308444-9.671111 1.137778-17.635556-0.341334-24.405333a59.278222 59.278222 0 0 0-5.859555-16.270222 23.210667 23.210667 0 0 0-9.955556-10.979556 411.306667 411.306667 0 0 0-4.664889-72.305777 373.304889 373.304889 0 0 0-15.872-65.422223 208.099556 208.099556 0 0 0-34.133333-63.715555 138.922667 138.922667 0 0 0-26.624-24.917334 219.306667 219.306667 0 0 0-37.205333-22.129777 256.113778 256.113778 0 0 0-45.056-16.270223A198.257778 198.257778 0 0 0 493.795556 56.888889c-14.051556 0-28.444444 1.422222-43.235556 3.697778-15.018667 2.673778-29.582222 6.712889-44.259556 12.743111-14.563556 6.030222-29.013333 14.336-43.235555 24.974222-14.279111 10.581333-27.136 24.007111-38.684445 40.277333-12.117333 17.351111-21.390222 36.977778-27.818666 58.766223a425.415111 425.415111 0 0 0-16.952889 130.332444 63.374222 63.374222 0 0 0-10.979556 19.114667c-2.503111 6.030222-4.096 13.084444-5.006222 21.219555-1.080889 8.135111 0 17.521778 3.015111 27.591111 3.185778 10.24 6.826667 18.033778 11.036445 23.552 4.266667 5.461333 8.192 9.671111 11.946666 12.743111 4.266667 3.128889 8.533333 5.12 12.856889 6.314667 3.015111 9.557333 6.030222 18.944 9.102222 27.989333 3.015111 7.793778 6.200889 15.36 9.955556 22.983112a53.646222 53.646222 0 0 0 12.8 17.635555c10.524444 8.533333 19.626667 16.668444 27.818667 24.462222 8.192 7.793778 12.8 18.944 14.051555 33.450667 0.568889 9.159111 0.910222 17.635556 0.910222 25.429333 0 7.964444-1.422222 15.36-4.096 22.641778a64.853333 64.853333 0 0 1-14.620444 21.788445 145.806222 145.806222 0 0 1-29.582222 22.641777c-15.644444 10.24-34.019556 18.033778-55.068445 23.495111-21.048889 5.518222-112.583111 36.807111-132.380444 43.52a169.358222 169.358222 0 0 0-51.484445 27.079112c-14.392889 11.320889-23.495111 28.273778-27.249777 50.574222-6.030222 38.570667-7.281778 44.771556-4.096 69.518222 3.242667 24.576 8.192 39.253333 14.961777 44.202667 5.518222 4.096 21.219556 9.045333 47.388445 14.848 26.168889 5.859556 190.805333 36.636444 382.008889 36.636444 24.917333 0 48.981333-0.568889 72.135111-1.592889a87.495111 87.495111 0 0 1 0.568889-25.486222z m378.026666-217.884444l-95.288889-13.824a57.287111 57.287111 0 0 1-38.513777-27.761778l-42.552889-85.788445c-3.242667-6.542222-7.68-9.898667-11.946667-9.898666-4.266667 0-8.533333 3.413333-11.946667 9.898666l-42.552888 85.788445c-6.599111 13.084444-23.893333 25.6-38.513778 27.761778l-95.288889 13.824c-14.620444 2.104889-18.033778 12.174222-7.338667 22.471111l68.949334 66.673777c10.524444 10.24 17.123556 30.435556 14.620444 44.942223l-16.213333 94.264889c-1.763556 10.410667 2.275556 16.611556 9.671111 16.611555 2.844444 0 6.030222-0.910222 9.557333-2.844444l85.162667-44.544a53.589333 53.589333 0 0 1 23.722666-5.12c8.533333 0 17.294222 1.706667 23.665778 5.12l85.162667 44.544c3.584 1.934222 6.997333 2.844444 9.671111 2.844444 7.281778 0 11.377778-6.200889 9.614222-16.611555l-16.213333-94.264889c-2.503111-14.506667 4.096-34.702222 14.563555-44.942223l69.006223-66.673777c10.808889-10.24 7.623111-20.366222-6.997334-22.471111z"></path></symbol><symbol id="oicon-notice" viewBox="0 0 1024 1024"><path d="M853.333333 113.777778a113.777778 113.777778 0 0 1 113.777778 113.777778v568.888888a113.777778 113.777778 0 0 1-113.777778 113.777778H170.666667a113.777778 113.777778 0 0 1-113.777778-113.777778V227.555556a113.777778 113.777778 0 0 1 113.777778-113.777778h682.666666z m-76.117333 557.112889H246.215111c-20.821333 0-37.944889 17.976889-37.944889 39.822222 0 21.902222 17.066667 39.822222 37.944889 39.822222h531.000889c20.821333 0 37.888-17.92 37.888-39.822222 0-21.845333-17.066667-39.822222-37.888-39.822222z m0-199.054223H246.215111c-20.821333 0-37.944889 17.976889-37.944889 39.822223 0 21.902222 17.066667 39.822222 37.944889 39.822222h531.000889c20.821333 0 37.831111-17.92 37.888-39.822222 0-21.845333-17.066667-39.822222-37.888-39.822223zM454.826667 295.253333H416.995556c-20.878222 0-37.944889 17.92-37.944889 39.822223 0 21.902222 17.066667 39.822222 37.944889 39.822222h37.888c20.878222 0 37.944889-17.92 37.944888-39.822222 0-21.902222-17.066667-39.822222-37.944888-39.822223z m-170.666667 0h-37.944889c-20.821333 0-37.831111 17.92-37.944889 39.822223 0 21.902222 17.066667 39.822222 37.944889 39.822222h37.944889c20.878222 0 37.944889-17.92 37.944889-39.822222 0-21.902222-17.066667-39.822222-37.944889-39.822223z"></path></symbol><symbol id="oicon-topic-light" viewBox="0 0 1024 1024"><path d="M704 298.688l36.416-181.952a39.04 39.04 0 0 1 38.272-31.36 26.24 26.24 0 0 1 25.728 31.36L768 298.688h138.688a32 32 0 0 1 0 64H755.2l-59.712 298.624h211.2a32 32 0 0 1 0 64h-224l-36.416 181.952a39.04 39.04 0 0 1-38.272 31.36 26.24 26.24 0 0 1-25.728-31.36l36.416-181.952H320l-36.416 181.952a39.04 39.04 0 0 1-38.272 31.36 26.24 26.24 0 0 1-25.728-31.36L256 725.312H117.312a32 32 0 1 1 0-64H268.8l59.712-298.624h-211.2a32 32 0 1 1 0-64h224l36.416-181.952a39.04 39.04 0 0 1 38.272-31.36 26.24 26.24 0 0 1 25.728 31.36l-36.416 181.952H704z m-12.8 64H392.512L332.8 661.312h298.688l59.712-298.624z"></path></symbol><symbol id="oicon-code-light" viewBox="0 0 1024 1024"><path d="M612.288 130.112a31.808 31.808 0 0 0-38.4 23.488L390.4 832c-4.288 17.088 6.4 34.112 23.488 38.4 2.112 0 6.4 2.112 8.512 2.112 14.912 0 27.712-8.512 29.888-23.424L633.6 168.512c6.4-17.024-4.288-34.112-21.312-38.4z m403.2 347.776l-270.976-270.976c-12.8-12.8-32-12.8-44.8 0-12.8 12.8-12.8 32 0 44.8L947.2 499.2l-249.6 249.6a30.912 30.912 0 0 0 23.488 53.312 32.064 32.064 0 0 0 23.424-8.512l270.976-270.912c6.4-6.4 8.512-14.976 8.512-23.488 0-8.512-4.288-14.912-8.512-21.312zM326.4 206.912c-12.8-12.8-32-12.8-44.8 0L8.512 477.888c-4.224 6.4-8.512 12.8-8.512 21.312s4.288 17.088 8.512 23.488L279.488 793.6c6.4 6.4 14.912 8.512 23.424 8.512A30.912 30.912 0 0 0 326.4 748.8L76.8 499.2l247.488-247.488c12.8-12.8 12.8-32 2.112-44.8z"></path></symbol><symbol id="oicon-emotion-light" viewBox="0 0 1024 1024"><path d="M957.696 815.808h0.448v-2.88l-0.448 2.88zM874.176 149.824C674.56-49.92 349.504-49.92 149.824 149.76c-199.744 199.68-199.744 524.672 0 724.352 199.68 199.744 524.672 199.744 724.352 0 199.744-199.68 199.744-524.672 0-724.352m-51.968 672.448a439.232 439.232 0 0 1-620.416 0 439.232 439.232 0 0 1 0-620.48 439.232 439.232 0 0 1 620.416 0 439.296 439.296 0 0 1 0 620.48m-470.016-364.16a55.232 55.232 0 1 0-0.128-110.464 55.232 55.232 0 0 0 0.128 110.4m317.632 0.128a55.232 55.232 0 0 0 0-110.4 55.232 55.232 0 0 0 0 110.4m1.92 185.152l-3.008 0.96a379.52 379.52 0 0 1-157.44 33.792 380.16 380.16 0 0 1-159.872-34.112l-3.008-0.896c-1.856-0.512-4.352-1.28-7.488-1.28a32.768 32.768 0 0 0-32.768 32.768c0 8.576 4.032 17.152 10.688 23.616l-0.448 1.984 8.384 3.84a452.096 452.096 0 0 0 184.832 40.512c63.36 0 125.376-13.632 185.216-40.896a32.896 32.896 0 0 0 17.088-28.8c0-21.184-19.136-38.592-42.176-31.488"></path></symbol><symbol id="oicon-image-light" viewBox="0 0 1024 1024"><path d="M96 256c0-64.832 52.48-117.312 117.312-117.312h597.376c64.768 0 117.312 52.48 117.312 117.312v512c0 64.832-52.48 117.312-117.312 117.312H213.312A117.312 117.312 0 0 1 96 768V256z m117.312-53.312A53.376 53.376 0 0 0 160 256v264.128l43.2-43.264a74.688 74.688 0 0 1 105.6 0L469.312 637.44l117.888-117.824a74.688 74.688 0 0 1 105.6 0l171.2 171.2V256a53.376 53.376 0 0 0-53.312-53.312H213.312z m649.344 577.28l-215.104-215.168a10.688 10.688 0 0 0-15.104 0L491.968 705.28a32 32 0 0 1-45.248 0L263.552 522.112a10.688 10.688 0 0 0-15.104 0L160 610.624V768c0 29.44 23.872 53.312 53.312 53.312h597.376a53.312 53.312 0 0 0 51.968-41.344z m-137.344-438.656a42.688 42.688 0 1 1-85.312 0 42.688 42.688 0 0 1 85.312 0z"></path></symbol><symbol id="oicon-arrow-right" viewBox="0 0 1024 1024"><path d="M728.192 521.728a42.368 42.368 0 0 1-11.392 20.48l-341.888 341.312a42.752 42.752 0 0 1-60.352 0 42.56 42.56 0 0 1 0-60.224L626.432 512 314.624 200.704a42.56 42.56 0 0 1 0-60.224c16.64-16.64 43.648-16.64 60.352 0L716.8 481.792c10.88 10.88 14.656 26.048 11.328 39.936z"></path></symbol><symbol id="oicon-close" viewBox="0 0 1024 1024"><path d="M575.634286 512l288.475428-289.645714A40.594286 40.594286 0 0 0 877.714286 191.122286c0-12.434286-4.388571-23.04-13.019429-31.817143A43.154286 43.154286 0 0 0 832.877714 146.285714a40.740571 40.740571 0 0 0-31.232 13.604572L512 448.438857 222.354286 159.890286A40.594286 40.594286 0 0 0 191.122286 146.285714c-12.434286 0-23.04 4.388571-31.817143 13.019429A43.154286 43.154286 0 0 0 146.285714 191.122286c0 12.507429 4.534857 22.893714 13.604572 31.232L448.438857 512l-288.548571 289.645714a40.594286 40.594286 0 0 0-13.604572 31.232c0 12.434286 4.388571 23.04 13.019429 31.817143a43.154286 43.154286 0 0 0 31.817143 13.019429c12.507429 0 22.893714-4.534857 31.232-13.604572L512 574.464l289.645714 289.645714a40.594286 40.594286 0 0 0 31.232 13.604572c12.434286 0 23.04-4.388571 31.817143-13.019429a43.154286 43.154286 0 0 0 13.019429-31.817143 40.740571 40.740571 0 0 0-13.604572-31.232L575.561143 512z"></path></symbol><symbol id="oicon-arrow-down" viewBox="0 0 1024 1024"><path d="M802.133333 345.344a84.309333 84.309333 0 0 0-67.498666 7.082667l-8.192 5.461333-214.186667 164.437333L297.386667 358.4c-32.426667-24.746667-81.066667-21.077333-108.458667 8.192a64.256 64.256 0 0 0 1.450667 91.221333l7.509333 6.570667 264.789333 201.813333a83.797333 83.797333 0 0 0 90.709334 5.717334l8.96-5.973334 263.936-202.581333a65.706667 65.706667 0 0 0 25.770666-65.365333 70.570667 70.570667 0 0 0-40.533333-49.066667l-9.386667-3.669333z"></path></symbol><symbol id="oicon-explore" viewBox="0 0 1024 1024"><path d="M878.580907 226.176c91.306667 11.434667 126.933333 50.346667 138.069333 84.693333 13.354667 34.304 15.616 89.216-46.762667 162.474667 15.616 203.648-97.962667 395.861333-287.232 473.685333-53.461333 22.869333-111.36 34.304-167.04 34.304a456.106667 456.106667 0 0 1-354.048-169.344c-100.224-6.826667-138.069333-50.346667-153.642666-84.650666-13.354667-34.346667-15.573333-91.52 48.981333-167.04-22.272-208.213333 93.525333-405.034667 285.013333-482.858667 193.749333-80.085333 409.770667-18.304 536.661334 148.736z m1.493333 335.786667l-9.941333 7.637333c-195.072 145.749333-461.482667 208.256-596.48 232.021333a366.08 366.08 0 0 0 377.813333 60.714667c125.738667-51.669333 210.944-167.424 228.608-300.373333zM515.615573 134.698667A382.378667 382.378667 0 0 0 375.37024 162.133333c-160.298667 66.346667-253.866667 233.386667-227.114667 407.296l2.218667 22.869334-15.573333 16.042666c-37.888 41.173333-51.2 73.216-44.544 84.650667 4.394667 9.045333 28.16 26.88 90.538666 29.653333 29.610667-2.986667 471.296-57.088 698.922667-280.405333l12.202667-14.677333c35.626667-38.912 46.762667-68.650667 42.282666-82.346667-4.437333-11.477333-33.408-25.173333-82.346666-29.781333l-22.314667-2.304-13.354667-18.304a360.832 360.832 0 0 0-300.629333-160.170667z m28.714667 140.501333a61.44 61.44 0 0 1 64 0c19.797333 11.946667 32 34.133333 32 58.069333 0 37.034667-28.672 67.072-64 67.072S512.33024 370.261333 512.33024 333.226667c0-23.978667 12.202667-46.08 32-58.069334z"></path></symbol><symbol id="oicon-recommend" viewBox="0 0 1024 1024"><path d="M0 512c0 123.136 49.152 239.957333 136.832 326.997333 19.2 19.114667 47.018667 19.114667 66.261333 0 19.2-19.114667 19.2-48.853333 0-67.925333A365.013333 365.013333 0 0 1 96.213333 512c0-97.706667 38.485333-191.104 106.88-259.072 19.2-19.072 19.2-48.810667 0-67.925333-19.242667-19.114667-47.018667-19.114667-66.261333 0A459.605333 459.605333 0 0 0 0 512z m271.488 191.104c19.242667 19.114667 49.194667 19.114667 68.437333 0 19.2-19.114667 19.2-48.853333 0-67.968A174.634667 174.634667 0 0 1 288.597333 512c0-46.72 17.066667-89.173333 51.328-123.136 19.2-19.114667 19.2-48.853333 0-67.968a48 48 0 0 0-68.437333 0A267.221333 267.221333 0 0 0 192.426667 512c0 72.192 27.818667 140.16 79.104 191.104z m615.68-518.101333a48 48 0 0 0-68.394667 0 47.189333 47.189333 0 0 0 0 67.925333c68.394667 67.968 109.013333 161.408 109.013334 259.072 0 97.706667-38.485333 191.104-109.013334 259.072a47.189333 47.189333 0 0 0 0 67.925333c19.2 19.114667 49.152 19.114667 68.394667 0A459.605333 459.605333 0 0 0 1024 512c0-123.136-49.152-239.957333-136.832-326.997333z m-203.093333 135.893333c19.242667-19.114667 47.061333-19.114667 66.304 0C801.664 371.84 829.44 439.808 831.573333 512h-2.133333a267.221333 267.221333 0 0 1-79.104 191.104c-19.242667 19.114667-47.061333 19.114667-66.304 0a47.189333 47.189333 0 0 1 0-67.968A174.634667 174.634667 0 0 0 735.402667 512c0-46.72-19.242667-89.173333-51.328-123.136a47.189333 47.189333 0 0 1 0-67.968zM512 387.882667c70.698667 0 128 55.552 128 124.117333 0 68.565333-57.301333 124.16-128 124.16S384 580.522667 384 512c0-68.565333 57.301333-124.16 128-124.16z"></path></symbol><symbol id="oicon-news" viewBox="0 0 1024 1024"><path d="M512 85.333333c235.690667 0 426.666667 191.061333 426.666667 426.666667s-190.976 426.666667-426.666667 426.666667S85.333333 747.690667 85.333333 512 276.309333 85.333333 512 85.333333m0-85.333333C229.632 0 0 229.632 0 512s229.76 512 512 512c282.368 0 512-229.76 512-512 0-282.368-229.632-512-512-512z m183.168 410.624l-144.938667-132.693333c-0.256-0.256-0.469333-0.256-0.682666-0.469334a57.6 57.6 0 0 0-15.018667-9.813333c-0.810667-0.384-1.578667-0.384-2.261333-0.725333-1.834667-0.682667-3.541333-0.896-5.376-1.493334a53.418667 53.418667 0 0 0-14.677334-2.133333c-1.92 0-3.84 0-5.802666 0.085333-5.717333 0.426667-11.221333 1.834667-16.512 4.010667-0.896 0.341333-1.92 0.426667-2.858667 0.896a55.722667 55.722667 0 0 0-14.506667 9.728l-143.786666 132.693333a57.514667 57.514667 0 0 0 77.866666 84.565334l47.36-43.690667v252.074667a57.386667 57.386667 0 1 0 114.901334 0v-252.757334l48.725333 44.629334a57.344 57.344 0 0 0 81.237333-3.541334 57.642667 57.642667 0 0 0-3.669333-81.365333z"></path></symbol><symbol id="oicon-rank" viewBox="0 0 1024 1024"><path d="M170.666667 256a128 128 0 0 1 128 128v426.666667a128 128 0 0 1-256 0V384a128 128 0 0 1 128-128z m0 85.333333a42.666667 42.666667 0 0 0-42.368 37.674667L128 384v426.666667a42.666667 42.666667 0 0 0 85.034667 4.992L213.333333 810.666667V384a42.666667 42.666667 0 0 0-37.674666-42.368L170.666667 341.333333zM512 85.333333a128 128 0 0 1 128 128v597.333334a128 128 0 0 1-256 0V213.333333a128 128 0 0 1 128-128z m0 85.333334a42.666667 42.666667 0 0 0-42.368 37.674666L469.333333 213.333333v597.333334a42.666667 42.666667 0 0 0 85.034667 4.992L554.666667 810.666667V213.333333a42.666667 42.666667 0 0 0-42.666667-42.666666zM853.333333 341.333333a128 128 0 0 1 128 128v341.333334a128 128 0 0 1-256 0v-341.333334a128 128 0 0 1 128-128z m0 85.333334a42.666667 42.666667 0 0 0-42.368 37.674666L810.666667 469.333333v341.333334a42.666667 42.666667 0 0 0 85.034666 4.992L896 810.666667v-341.333334a42.666667 42.666667 0 0 0-42.666667-42.666666z"></path></symbol><symbol id="oicon-send" viewBox="0 0 1024 1024"><path d="M470.016 486.656l-252.672-37.632a102.4 102.4 0 0 1-80.853333-65.493333L28.885333 95.146667a51.626667 51.626667 0 0 1 29.013334-66.133334c13.013333-5.077333 27.477333-4.394667 39.936 1.834667L970.24 465.92a51.712 51.712 0 0 1 0 92.074667l-872.448 435.2a49.706667 49.706667 0 0 1-67.072-23.594667 52.224 52.224 0 0 1-1.834667-40.704l107.605334-288.426667a102.4 102.4 0 0 1 80.853333-65.493333l252.672-37.632a25.6 25.6 0 0 0 0-50.688v-0.042667z"></path></symbol><symbol id="oicon-gitee-circle-solid" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 1 0 1024A512 512 0 0 1 512 0z m233.244444 256H426.666667a170.666667 170.666667 0 0 0-170.666667 170.666667v318.577777c0 12.515556 10.24 22.755556 22.755556 22.755556h335.644444a153.6 153.6 0 0 0 153.6-153.6V483.555556a22.755556 22.755556 0 0 0-22.755556-22.755556H483.555556a22.755556 22.755556 0 0 0-22.755556 22.755556v56.888888a22.755556 22.755556 0 0 0 18.147556 22.300445l4.551111 0.455111H642.844444a22.755556 22.755556 0 0 1 22.300445 18.204444l0.455111 4.551112v11.377777a68.266667 68.266667 0 0 1-68.266667 68.266667H381.155556a22.755556 22.755556 0 0 1-22.755556-22.755556V426.666667a68.266667 68.266667 0 0 1 61.269333-67.925334L426.666667 358.4h318.520889a22.755556 22.755556 0 0 0 22.755555-22.755556v-56.888888a22.755556 22.755556 0 0 0-18.090667-22.300445L745.244444 256z"></path></symbol><symbol id="oicon-microphone" viewBox="0 0 1024 1024"><path d="M785.066667 528.839111c0 126.748444-127.601778 235.975111-273.066667 235.975111s-273.066667-109.226667-273.066667-235.975111H170.666667c0 155.534222 137.500444 287.516444 307.2 303.445333V967.111111h68.266666v-134.826667c169.699556-15.928889 307.2-147.911111 307.2-303.445333h-68.266666zM512 680.561778c112.014222 0 204.8-90.737778 204.8-202.296889V259.185778C716.8 147.626667 624.014222 56.888889 512 56.888889S307.2 147.626667 307.2 259.185778v219.079111c0 111.502222 92.785778 202.296889 204.8 202.296889zM375.466667 259.185778c0-73.898667 62.350222-134.826667 136.533333-134.826667 74.183111 0 136.533333 60.928 136.533333 134.826667v219.079111c0 73.898667-62.350222 134.826667-136.533333 134.826667-74.183111 0-136.533333-60.928-136.533333-134.826667V259.185778z"></path></symbol><symbol id="oicon-play" viewBox="0 0 1024 1024"><path d="M512 56.888889a455.111111 455.111111 0 1 0 0 910.222222A455.111111 455.111111 0 0 0 512 56.888889z m272.213333 727.324444A382.293333 382.293333 0 0 1 512 896.910222a382.293333 382.293333 0 0 1-272.213333-112.696889A382.293333 382.293333 0 0 1 127.089778 512a382.293333 382.293333 0 0 1 112.696889-272.213333A382.293333 382.293333 0 0 1 512 127.089778a382.293333 382.293333 0 0 1 272.213333 112.696889A382.520889 382.520889 0 0 1 896.910222 512a382.293333 382.293333 0 0 1-112.696889 272.213333z m-48.071111-302.478222L426.552889 302.990222a35.157333 35.157333 0 0 0-52.622222 30.378667v357.376a35.100444 35.100444 0 0 0 52.622222 30.378667l309.589333-178.744889a35.100444 35.100444 0 0 0 0-60.643556z m-292.010666 148.366222V394.24l204.288 117.873778-204.288 117.987555z"></path></symbol><symbol id="oicon-topic" viewBox="0 0 1024 1024"><path d="M898.616889 334.506667h-150.016l39.537778-148.935111v-3.413334c0-5.745778-4.664889-11.491556-11.605334-11.491555h-73.272889a12.515556 12.515556 0 0 0-11.605333 9.159111l-39.537778 154.624h-183.751111l39.537778-148.878222v-3.413334C507.904 176.355556 503.296 170.666667 496.298667 170.666667H423.025778a12.515556 12.515556 0 0 0-11.605334 9.159111L370.744889 333.368889h-160.426667c-5.859556 0-9.329778 3.413333-11.662222 8.021333l-18.602667 68.721778v2.275556c0 5.745778 4.664889 11.491556 11.605334 11.491555h154.680889l-45.340445 174.08H143.928889c-5.802667 0-9.272889 3.413333-11.605333 8.021333L113.777778 674.645333v2.275556c0 5.745778 4.664889 11.491556 11.605333 11.491555h151.153778l-39.537778 151.153778v2.275556c0 5.745778 4.664889 11.491556 11.662222 11.491555h73.216c5.859556 0 10.467556-3.413333 11.662223-9.159111l40.675555-156.899555h182.556445l-39.537778 151.153777v2.275556c0 5.745778 4.664889 11.491556 11.605333 11.491556h73.272889c5.802667 0 10.467556-3.413333 11.605333-9.159112l40.732445-156.956444h159.288889c5.802667 0 10.467556-3.413333 11.605333-9.102222l18.602667-68.778667v-2.275555c0-5.688889-4.664889-11.434667-11.605334-11.434667h-153.486222l45.340445-174.08h155.818666c5.802667 0 10.467556-3.470222 11.605334-9.216L910.222222 342.471111v-2.275555c0-1.137778-5.802667-5.688889-11.605333-5.688889z m-316.302222 265.671111H398.620444l45.340445-174.08h182.613333l-44.259555 174.08z"></path></symbol><symbol id="oicon-money-solid" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 1 0 1024A512 512 0 0 1 512 0zM437.134222 250.311111a41.756444 41.756444 0 0 0-49.664-19.911111 42.268444 42.268444 0 0 0-27.477333 51.427556h-0.056889l0.568889 1.706666v0.113778l43.804444 136.248889h-50.972444a42.097778 42.097778 0 0 0-40.049778 42.154667 42.097778 42.097778 0 0 0 40.049778 42.211555h106.382222v63.260445h-106.382222a42.097778 42.097778 0 0 0-40.049778 42.211555 42.097778 42.097778 0 0 0 40.049778 42.154667h106.382222v95.118222c0 29.013333 23.324444 52.622222 52.224 52.622222a52.451556 52.451556 0 0 0 52.167111-54.784h0.113778V651.946667h104.561778a42.097778 42.097778 0 0 0 41.927111-42.211556 42.097778 42.097778 0 0 0-41.927111-42.211555H564.224V504.32h104.561778a42.097778 42.097778 0 0 0 41.927111-42.211556 42.097778 42.097778 0 0 0-41.927111-42.268444h-49.664l43.804444-136.135111 0.568889-1.763556a42.325333 42.325333 0 0 0-27.534222-51.427555 41.813333 41.813333 0 0 0-52.167111 25.372444l-0.398222 1.251556-0.170667 0.568889-0.170667 0.455111-51.996444 161.735111h-38.684445l-51.996444-161.848889-0.341333-0.967111-0.398223-1.308445z"></path></symbol><symbol id="oicon-weeklyview-solid" viewBox="0 0 1024 1024"><path d="M866.417778 137.841778H768v-39.367111c0-31.516444-25.6-59.107556-59.050667-59.107556-31.516444 0-59.107556 25.6-59.107555 59.107556v39.367111H374.158222v-39.367111c0-31.516444-25.6-59.107556-59.107555-59.107556-31.459556 0-59.050667 25.6-59.050667 59.107556v39.367111H157.582222c-43.349333 0-78.791111 35.441778-78.791111 78.791111v38.4c0 15.758222 13.767111 29.582222 29.525333 29.582222h807.367112c15.758222 0 29.582222-13.824 29.582222-29.582222v-38.4c0-43.349333-35.498667-78.791111-78.791111-78.791111z m49.265778 221.297778H108.316444a30.264889 30.264889 0 0 0-29.582222 29.525333v517.176889c0 43.349333 35.498667 78.791111 78.791111 78.791111h708.949334c43.292444 0 78.734222-35.441778 78.734222-78.791111V388.664889a30.264889 30.264889 0 0 0-29.525333-29.582222zM521.841778 827.733333c-5.916444 13.767111-19.683556 21.617778-35.441778 21.617778-21.617778 0-37.432889-17.635556-37.432889-35.384889 0-3.982222 1.991111-9.841778 3.982222-15.758222l104.334223-224.483556h-149.617778c-17.749333 0-33.564444-11.832889-33.564445-29.582222 0-15.758222 15.815111-29.525333 33.564445-29.525333h204.8c19.683556 0 37.376 15.758222 37.376 35.441778a28.444444 28.444444 0 0 1-3.982222 13.824l-124.017778 263.850666z"></path></symbol><symbol id="oicon-write-solid" viewBox="0 0 1024 1024"><path d="M921.6 1024H102.4C46.08 1024 0 977.92 0 921.6V102.4C0 46.08 46.08 0 102.4 0h819.2c56.32 0 102.4 46.08 102.4 102.4v819.2c0 56.32-46.08 102.4-102.4 102.4z m-384-358.4L435.2 768h384v-102.4H537.6z m87.04-435.2l-20.48 5.12L204.8 640v128h128l404.48-404.48c5.12-5.12 5.12-10.24 5.12-20.48l-5.12-20.48-92.16-92.16c-5.12 5.12-10.24 0-20.48 0z"></path></symbol><symbol id="oicon-fire-solid" viewBox="0 0 1024 1024"><path d="M829.036978 417.82837a21.310721 21.310721 0 0 0-1.919885-2.431854c-10.49537-12.351259-47.037178-53.308801-71.99568-63.484191a26.622403 26.622403 0 0 0-25.982441 3.647781 27.198368 27.198368 0 0 0-10.559367 24.318541c0.063996 0.639962 6.015639 68.027918-33.789972 110.393377-23.038618 24.446533-52.348859 38.269704-76.411416 46.013239 19.582825-57.148571 45.245285-155.958642 27.134372-242.929424C614.585845 193.073856 499.84073 19.260284 494.913025 12.028718a26.558406 26.558406 0 0 0-31.806091-10.175389 27.00638 27.00638 0 0 0-16.766994 29.054257c0.127992 0.895946 12.287263 88.122713-18.558887 159.094454a27.710337 27.710337 0 0 0-1.599904 5.055697c-0.191988 0.639962-16.958982 65.404076-132.408055 134.199948-54.076755 32.190069-97.210167 86.458812-100.217987 90.554566-42.877427 63.99616-65.66006 139.511629-65.532068 216.690999C128.023039 850.250425 300.236706 1024 512 1024s383.976961-173.813571 383.976961-387.49675a387.432754 387.432754 0 0 0-66.875987-218.610884l-0.063996-0.063996z"></path></symbol><symbol id="oicon-all" viewBox="0 0 1024 1024"><path d="M224 128C171.2 128 128 171.2 128 224S171.2 320 224 320 320 276.8 320 224 276.8 128 224 128z m0 288C171.2 416 128 459.2 128 512s43.2 96 96 96S320 564.8 320 512s-43.2-96-96-96z m0 288c-52.8 0-96 43.2-96 96S171.2 896 224 896 320 852.8 320 800 276.8 704 224 704z m576-384c52.8 0 96-43.2 96-96S852.8 128 800 128 704 171.2 704 224 747.2 320 800 320zM512 704c-52.8 0-96 43.2-96 96S459.2 896 512 896s96-43.2 96-96S564.8 704 512 704z m288 0c-52.8 0-96 43.2-96 96s43.2 96 96 96 96-43.2 96-96-43.2-96-96-96z m0-288c-52.8 0-96 43.2-96 96s43.2 96 96 96S896 564.8 896 512s-43.2-96-96-96zM512 416c-52.8 0-96 43.2-96 96S459.2 608 512 608 608 564.8 608 512 564.8 416 512 416zM512 128c-52.8 0-96 43.2-96 96S459.2 320 512 320s96-43.2 96-96S564.8 128 512 128z"></path></symbol><symbol id="oicon-question-solid" viewBox="0 0 1024 1024"><path d="M511.168 0C228.288 0 0 214.272 0 480c0 85.76 23.872 164.544 64.768 234.88 5.12 8.576 6.784 18.816 3.392 27.392l-47.744 152.576c-8.512 27.456 17.088 51.456 44.352 42.88l149.888-53.12a34.176 34.176 0 0 1 28.992 3.392A526.912 526.912 0 0 0 512.832 960C795.712 960 1024 745.728 1024 480 1022.272 214.272 793.984 0 511.168 0z m51.072 771.456c0 18.816-15.36 34.24-34.048 34.24H494.08a34.304 34.304 0 0 1-34.048-34.24v-34.304c0-18.88 15.36-34.304 34.048-34.304h34.112c18.752 0 34.048 15.424 34.048 34.304v34.304z m13.632-217.728a18.432 18.432 0 0 0-13.632 17.152v27.392c0 18.88-15.36 36.032-34.048 36.032H494.08c-18.688 0-34.048-17.152-34.048-36.032V570.88c0-51.456 34.048-97.728 83.52-114.88 18.688-6.848 35.776-15.424 45.952-30.848 57.92-77.12 0-166.272-76.672-168-27.264-1.728-54.528 10.24-74.944 29.12a97.92 97.92 0 0 0-27.264 48 34.432 34.432 0 0 1-32.384 27.456h-35.776c-20.48 0-37.504-20.608-34.048-41.152 8.512-41.152 27.264-78.848 57.92-108.032a198.272 198.272 0 0 1 148.224-58.24c107.328 3.392 195.904 92.544 199.36 200.576a200.512 200.512 0 0 1-138.048 198.848z"></path></symbol><symbol id="oicon-job" viewBox="0 0 1024 1024"><path d="M515.370667 570.666667c-117.845333 0-213.333333-99.072-213.333334-221.312S397.525333 128 515.370667 128c117.802667 0 213.333333 99.114667 213.333333 221.354667 0 122.24-95.530667 221.312-213.333333 221.312z m0-63.232c84.138667 0 152.362667-70.784 152.362666-158.08 0-87.338667-68.224-158.122667-152.362666-158.122667-84.181333 0-152.405333 70.826667-152.405334 158.122667 0 87.296 68.266667 158.08 152.405334 158.08z m335.232 347.818666c0 17.493333-13.653333 31.658667-30.506667 31.658667a31.061333 31.061333 0 0 1-30.464-31.658667c0-157.141333-122.794667-284.586667-274.261333-284.586666s-274.304 127.445333-274.304 284.586666c0 17.493333-13.653333 31.658667-30.464 31.658667a31.061333 31.061333 0 0 1-30.506667-31.658667c3.498667-189.482667 152.576-341.248 335.274667-341.248 182.656 0 331.733333 151.765333 335.232 341.248z m-734.805334-22.485333h792.405334c20.309333 0 30.464 10.538667 30.464 31.573333 0 21.12-10.154667 31.658667-30.464 31.658667H115.797333C95.488 896 85.333333 885.461333 85.333333 864.384s10.154667-31.616 30.464-31.616z m416.554667-289.792a29.781333 29.781333 0 0 1 29.397333-8.533333 31.061333 31.061333 0 0 1 21.76 22.186666 32.469333 32.469333 0 0 1-7.552 30.634667l-52.266666 55.466667-52.266667-55.466667a32.469333 32.469333 0 0 1 0.426667-44.757333 29.738667 29.738667 0 0 1 43.136 0.469333l8.704 9.258667 8.661333-9.173334v-0.085333z m-77.056 250.752l37.930667-196.224h60.970666l37.888 196.266667-68.394666 38.997333-68.394667-39.04z"></path></symbol><symbol id="oicon-fire" viewBox="0 0 1024 1024"><path d="M880.128 463.104a397.141333 397.141333 0 0 0-94.72-131.669333l-33.28-30.506667a9.258667 9.258667 0 0 0-14.890667 3.754667l-14.848 42.666666c-9.258667 26.709333-26.282667 54.016-50.389333 80.896a7.125333 7.125333 0 0 1-4.693333 2.261334 6.314667 6.314667 0 0 1-4.906667-1.706667 6.741333 6.741333 0 0 1-2.304-5.504c4.266667-68.778667-16.341333-146.346667-61.354667-230.826667-37.248-70.186667-89.045333-124.928-153.728-163.114666L397.824 1.621333a9.173333 9.173333 0 0 0-13.696 8.32l2.517333 54.869334c1.706667 37.461333-2.645333 70.613333-12.928 98.133333A325.888 325.888 0 0 1 320 256.170667a337.877333 337.877333 0 0 1-54.272 52.650666 402.986667 402.986667 0 0 0-114.645333 138.88 397.44 397.44 0 0 0-9.728 331.776 401.493333 401.493333 0 0 0 214.186666 212.096 402.133333 402.133333 0 0 0 156.458667 31.317334 404.096 404.096 0 0 0 156.458667-31.189334 398.421333 398.421333 0 0 0 127.872-85.333333 395.605333 395.605333 0 0 0 117.973333-282.197333 393.386667 393.386667 0 0 0-34.176-161.024z m-138.410667 387.754667A324.010667 324.010667 0 0 1 512 945.024a324.010667 324.010667 0 0 1-229.717333-94.165333 317.397333 317.397333 0 0 1-94.848-226.730667c0-49.706667 11.178667-97.365333 33.28-141.738667a323.242667 323.242667 0 0 1 92.330666-111.872 399.530667 399.530667 0 0 0 66.986667-64.896 404.906667 404.906667 0 0 0 66.474667-115.456c6.4-17.194667 11.008-34.986667 13.824-53.12 27.562667 25.344 50.645333 55.978667 69.973333 91.861334 38.144 71.552 55.765333 135.210667 52.309333 189.397333a84.565333 84.565333 0 0 0 147.2 61.909333 375.466667 375.466667 0 0 0 39.338667-52.096c16 20.48 29.354667 42.752 39.978667 66.730667 18.176 40.96 27.434667 84.48 27.434666 129.28 0 85.589333-33.706667 166.144-94.848 226.730667z"></path></symbol><symbol id="oicon-gitee-circle-light" viewBox="0 0 1024 1024"><path d="M512 0c282.752 0 512 229.248 512 512s-229.248 512-512 512S0 794.752 0 512 229.248 0 512 0z m0 77.568C272.042667 77.568 77.568 272.042667 77.568 512c0 239.957333 194.474667 434.432 434.432 434.432 239.957333 0 434.432-194.474667 434.432-434.432 0-239.957333-194.474667-434.432-434.432-434.432z"></path><path d="M725.802667 465.066667H485.973333a20.906667 20.906667 0 0 0-20.906666 20.906666v52.096c0 11.52 9.386667 20.906667 20.906666 20.906667h146.005334c11.52 0 20.864 9.301333 20.864 20.821333v10.410667c0 34.56-28.032 62.592-62.592 62.592H392.106667a20.864 20.864 0 0 1-20.906667-20.864v-198.144A62.592 62.592 0 0 1 433.792 371.2h292.010667a20.906667 20.906667 0 0 0 20.864-20.864V298.24a20.821333 20.821333 0 0 0-20.821334-20.864h-292.010666A156.458667 156.458667 0 0 0 277.333333 433.792v292.010667c0 11.52 9.344 20.864 20.864 20.864H605.866667a140.8 140.8 0 0 0 140.8-140.8v-119.893334a20.864 20.864 0 0 0-20.864-20.906666z"></path></symbol><symbol id="oicon-money" viewBox="0 0 1024 1024"><path d="M512 0c282.752 0 512 229.248 512 512s-229.248 512-512 512S0 794.752 0 512 229.248 0 512 0z m0 76.8C271.658667 76.8 76.8 271.658667 76.8 512c0 240.341333 194.858667 435.2 435.2 435.2 240.341333 0 435.2-194.858667 435.2-435.2 0-240.341333-194.858667-435.2-435.2-435.2z"></path><path d="M667.605333 567.509333h1.194667c23.168 0 41.898667 18.901333 41.898667 42.24 0 23.296-18.773333 42.197333-41.898667 42.197334h-104.618667v92.885333h-0.042666l0.042666 2.133333A52.48 52.48 0 0 1 512 799.616a52.48 52.48 0 0 1-52.266667-52.650667l0.042667-2.133333V651.946667H353.322667v-0.042667a42.069333 42.069333 0 0 1-40.021334-42.197333c0-22.656 17.749333-41.173333 40.021334-42.154667h1.365333l0.512-0.042667h104.576V504.32H353.28a42.069333 42.069333 0 0 1-40.021333-42.197333c0-22.698667 17.749333-41.216 40.021333-42.154667V419.84h51.029333L360.533333 283.648v-0.042667l-0.042666-0.085333-0.554667-1.706667h0.042667A42.24 42.24 0 0 1 387.456 230.4a41.813333 41.813333 0 0 1 52.138667 25.386667l0.426666 1.28 0.213334 0.512 0.128 0.426666 52.053333 161.877334h38.613333l52.053334-161.706667 0.128-0.512 0.170666-0.512 0.426667-1.28a41.813333 41.813333 0 0 1 52.138667-25.344 42.24 42.24 0 0 1 27.477333 51.370667h0.042667l-0.554667 1.792-43.776 136.192h49.664c23.168 0 41.898667 18.901333 41.898667 42.197333 0 23.338667-18.773333 42.24-41.898667 42.24l-1.194667-0.042667h-103.424v63.232h103.424z"></path></symbol><symbol id="oicon-maintain" viewBox="0 0 1024 1024"><path d="M788.650667 754.389333a18.816 18.816 0 0 1-0.213334 26.794667 18.944 18.944 0 0 1-26.368-0.426667l-115.754666-115.498666a18.688 18.688 0 0 1 0.426666-26.581334 19.456 19.456 0 0 1 26.88 0l115.029334 115.712zM737.493333 102.4c12.032 0 24.32 0.938667 36.394667 3.84 12.8 2.176 24.362667 5.973333 35.541333 10.666667a31.573333 31.573333 0 0 1 16.341334 41.386666 32.768 32.768 0 0 1-6.528 9.813334c-23.893333 23.893333-47.786667 47.616-71.509334 71.509333l4.010667 14.293333 3.584 14.506667 14.762667 4.053333 14.293333 3.797334c23.722667-23.893333 47.658667-47.36 71.509333-71.509334a31.701333 31.701333 0 0 1 44.714667 0c3.584 3.84 6.229333 8.533333 7.594667 13.44 4.224 10.24 7.594667 20.949333 9.6 31.658667v0.469333h0.213333a184.746667 184.746667 0 0 1-50.474667 166.698667 183.381333 183.381333 0 0 1-130.048 53.845333c-3.626667 0-7.168-0.213333-10.752-0.213333l-34.858666 34.432 191.744 191.658667 1.536 1.792c24.362667 25.258667 36.437333 57.685333 36.437333 90.026666 0 33.109333-12.501333 66.389333-37.973333 91.648l-0.426667 0.426667a129.450667 129.450667 0 0 1-91.178667 37.546667 127.957333 127.957333 0 0 1-91.648-37.973334L508.16 688.213333 312.32 884.693333c-40.917333 40.874667-90.282667 44.458667-130.730667 27.008a127.573333 127.573333 0 0 1-41.301333-27.946666H139.946667a131.498667 131.498667 0 0 1-27.733334-41.088c-17.408-40.448-13.824-90.026667 27.306667-130.688v-0.426667l218.453333-218.581333-79.914666-80-71.082667-21.205334a31.061333 31.061333 0 0 1-20.096-17.621333L118.741333 214.357333a31.36 31.36 0 0 1 5.589334-36.650666l28.586666-28.373334 28.16-28.16a31.061333 31.061333 0 0 1 34.432-6.698666l161.792 69.034666a30.933333 30.933333 0 0 1 17.877334 20.138667l20.992 71.04 79.957333 80 57.472-57.002667a203.861333 203.861333 0 0 1-0.469333-10.666666h0.213333c0-51.2 20.608-97.450667 53.845333-130.517334v-0.213333A184.874667 184.874667 0 0 1 737.493333 102.4zM647.253333 549.76l-94.293333 94.293333 191.701333 191.658667a66.773333 66.773333 0 0 0 94.293334 0.213333l0.426666-0.213333c12.970667-12.458667 18.986667-30.122667 18.986667-47.104 0-16.554667-5.973333-33.28-18.048-45.824l-1.365333-1.365333-191.701334-191.658667z m-244.906666-101.034667l49.408-49.109333L366.08 313.813333a31.872 31.872 0 0 1-8.533333-15.658666l-18.517334-62.805334-128.682666-54.272-13.184 12.970667-13.226667 13.354667 54.784 128.725333 64.768 18.986667c5.376 1.578667 9.813333 4.266667 13.397333 8.32l85.376 85.333333z m330.666666-283.306666a120.490667 120.490667 0 0 0-81.322666 35.754666 119.936 119.936 0 0 0-35.712 85.802667h0.426666v8.746667l0.896 7.338666a31.146667 31.146667 0 0 1-8.533333 28.373334l-424.704 424.533333h-0.256c-19.626667 20.309333-21.888 43.349333-13.824 62.336 3.328 7.381333 8.490667 14.72 14.506667 20.992 6.485333 6.272 13.653333 11.178667 21.461333 14.506667 18.986667 8.277333 41.770667 6.058667 61.866667-13.610667l217.685333-217.6 0.853333-0.896 138.581334-138.752 0.853333-1.109333 66.56-66.176h0.256a29.866667 29.866667 0 0 1 26.581333-9.130667c3.114667 0.426667 6.058667 0.853333 9.386667 0.853333 2.261333 0.256 5.333333 0.469333 8.96 0.469334 33.493333 0 63.872-13.653333 85.802667-35.072v-0.426667a119.978667 119.978667 0 0 0 35.029333-81.365333c-13.610667 13.866667-27.221333 27.306667-40.874667 41.344a32.426667 32.426667 0 0 1-31.701333 9.6l-31.744-8.704-32.170667-8.704a30.634667 30.634667 0 0 1-22.357333-22.357334l-8.490667-32.170666-8.704-32.170667a30.72 30.72 0 0 1 8.277334-29.738667c14.08-14.250667 28.16-28.373333 42.453333-42.666666z"></path></symbol><symbol id="oicon-switch" viewBox="0 0 1024 1024"><path d="M924.379429 145.700571L709.632 1.536a9.142857 9.142857 0 0 0-14.189714 7.753143V102.4H366.006857C163.913143 102.4 0 267.483429 0 471.04V544.914286c0 52.882286 11.117714 103.277714 31.012571 148.626285a9.216 9.216 0 0 0 13.458286 4.022858L153.6 624.274286a9.362286 9.362286 0 0 0 3.657143-10.605715 223.085714 223.085714 0 0 1-10.752-68.754285V471.04c0-59.099429 22.893714-114.614857 64.365714-156.525714a217.307429 217.307429 0 0 1 155.136-64.731429h329.435429v93.696c0 7.387429 8.192 11.776 14.189714 7.753143l214.601143-144.164571c21.869714-14.628571 21.869714-46.811429 0.146286-61.44zM99.766857 878.299429l214.601143 144.164571a9.142857 9.142857 0 0 0 14.189714-7.753143V921.6h329.435429C860.086857 921.6 1024 756.516571 1024 552.96V479.085714c0-52.882286-11.117714-103.277714-31.012571-148.626285a9.216 9.216 0 0 0-13.458286-4.022858l-108.982857 73.289143a9.362286 9.362286 0 0 0-3.657143 10.605715c7.021714 21.869714 10.678857 45.056 10.678857 68.754285V552.96c0 59.099429-22.893714 114.614857-64.292571 156.525714a217.234286 217.234286 0 0 1-155.282286 64.731429H328.557714V680.448c0-7.387429-8.192-11.776-14.189714-7.753143l-214.601143 144.164572a37.229714 37.229714 0 0 0 0 61.44z"></path></symbol><symbol id="oicon-org" viewBox="0 0 1024 1024"><path d="M456.96 22.656a78.016 78.016 0 0 1 110.08 0l100.48 100.544h155.52c42.88 0.128 77.632 34.88 77.76 77.76v155.52l100.48 100.544a78.016 78.016 0 0 1 0 109.952l-100.48 100.48v155.52a78.016 78.016 0 0 1-77.76 77.824h-155.52l-100.48 100.48a78.016 78.016 0 0 1-110.016 0l-100.48-100.48H200.96a78.016 78.016 0 0 1-77.824-77.76v-155.52L22.72 567.04a78.016 78.016 0 0 1 0-110.016l100.48-100.48V200.96A78.016 78.016 0 0 1 200.96 123.136h155.52z m235.904 375.104c-16.64-18.368-38.976-18.368-55.68 0L459.2 593.792l-72.32-79.68c-16.704-18.368-39.04-18.368-55.68 0A49.28 49.28 0 0 0 320 544.768a49.28 49.28 0 0 0 11.136 30.592l100.16 116.416c5.568 6.08 16.704 12.224 27.84 12.224a40.576 40.576 0 0 0 27.84-12.224l205.888-226.624C704 459.008 704 446.72 704 428.416a49.28 49.28 0 0 0-11.136-30.656z"></path></symbol><symbol id="oicon-gitee-circle" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 1 0 1024A512 512 0 0 1 512 0z m259.145143 227.547429h-354.011429a189.659429 189.659429 0 0 0-189.586285 189.659428v354.011429c0 13.897143 11.337143 25.234286 25.307428 25.234285h372.955429a170.642286 170.642286 0 0 0 170.642285-170.642285V480.402286a25.307429 25.307429 0 0 0-25.307428-25.307429H480.402286a25.307429 25.307429 0 0 0-25.307429 25.307429v63.195428c0 12.214857 8.630857 22.454857 20.187429 24.795429l5.12 0.512h177.005714c12.214857 0 22.381714 8.630857 24.722286 20.187428l0.512 5.12v12.580572c0 41.910857-33.938286 75.849143-75.849143 75.849143H366.592a25.307429 25.307429 0 0 1-25.307429-25.234286V417.206857c0-39.131429 29.622857-71.314286 67.584-75.410286l8.265143-0.438857h354.011429c13.897143 0 25.234286-11.337143 25.234286-25.307428v-63.195429a25.307429 25.307429 0 0 0-20.114286-24.795428l-5.12-0.512z"></path></symbol><symbol id="oicon-ask" viewBox="0 0 1024 1024"><path d="M146.295156 1024v-232.727273H73.079156A73.774545 73.774545 0 0 1 0.002793 716.986182V74.193455C0.002793 33.28 32.817338 0 73.125702 0H950.926429C991.188247 0 1024.002793 33.28 1024.002793 74.193455v642.839272c0 40.96-32.814545 74.193455-73.122909 74.193455H375.810793L146.295156 1024zM73.079156 49.431273a24.576 24.576 0 0 0-24.343272 24.762182v642.839272c0 13.684364 10.891636 24.762182 24.343272 24.762182h121.949091v162.816l160.581818-162.816h595.223273a24.529455 24.529455 0 0 0 24.343273-24.762182V74.193455a24.576 24.576 0 0 0-24.343273-24.762182H73.079156zM292.58752 438.458182c15.080727 8.843636 33.652364 8.843636 48.733091 0 15.080727-8.843636 24.389818-25.134545 24.389818-42.821818s-9.309091-33.978182-24.389818-42.821819a48.174545 48.174545 0 0 0-48.733091 0c-15.080727 8.843636-24.389818 25.134545-24.389818 42.821819s9.309091 33.978182 24.389818 42.821818z m390.050909 0c15.127273 8.843636 33.698909 8.843636 48.779636 0 15.080727-8.843636 24.389818-25.134545 24.389819-42.821818 0-27.322182-21.829818-49.477818-48.779637-49.477819-26.903273 0-48.733091 22.155636-48.733091 49.477819 0 17.687273 9.309091 33.978182 24.389819 42.821818zM512.002793 445.067636c26.949818 0 48.779636-22.155636 48.779636-49.431272 0-27.322182-21.876364-49.477818-48.779636-49.477819-26.949818 0-48.779636 22.155636-48.779637 49.477819 0 27.275636 21.876364 49.431273 48.779637 49.431272z"></path></symbol><symbol id="oicon-write" viewBox="0 0 1024 1024"><path d="M975.073029 1023.83715H48.926971A48.764121 48.764121 0 0 1 0.16285 975.073029V48.926971C0.16285 21.985725 21.985725 0.16285 48.926971 0.16285H585.053121a24.382061 24.382061 0 0 1 0 48.764121h-511.837151a24.382061 24.382061 0 0 0-24.33553 24.33553V950.78403c0 13.447358 10.888172 24.33553 24.33553 24.33553h877.56806a24.33553 24.33553 0 0 0 24.33553-24.33553v-511.837151a24.382061 24.382061 0 0 1 48.764121 0v536.172681c0 26.941246-21.822875 48.764121-48.764121 48.764121z m-487.362028-292.491666H316.338617a24.102877 24.102877 0 0 1-23.963285-24.195938c0-0.465307 0.279184-0.884082 0.279184-1.349389V535.730632c0-4.28082 0.186123-12.19103 0.465306-23.730632L790.346348 14.773474a48.764121 48.764121 0 0 1 68.911893 0l137.870316 137.870316a48.764121 48.764121 0 0 1 0 68.958423L487.711001 731.345484z m457.768535-561.624945L842.088431 66.236373a24.382061 24.382061 0 0 0-34.432681 0L340.534555 533.357568a19.496342 19.496342 0 0 1 0.465306 2.419594v147.222977h125.725817l478.800388-478.800389a24.382061 24.382061 0 0 0 0-34.525742h-0.093061z"></path></symbol><symbol id="oicon-plus" viewBox="0 0 1024 1024"><path d="M1024 426.666667H597.333333V0H426.666667v426.666667H0v170.666666h426.666667v426.666667h170.666666V597.333333h426.666667z"></path></symbol><symbol id="oicon-trending" viewBox="0 0 1106 1024"><path d="M0 290.766798m55.308301 0l0 0q55.308301 0 55.3083 55.3083l0 608.391307q0 55.308301-55.3083 55.3083l0 0q-55.308301 0-55.308301-55.3083l0-608.391307q0-55.308301 55.308301-55.3083Z" fill="#F5A623"></path><path d="M331.849803 14.225295m55.308301 0l0 0q55.308301 0 55.308301 55.3083l0 884.93281q0 55.308301-55.308301 55.3083l0 0q-55.308301 0-55.308301-55.3083l0-884.93281q0-55.308301 55.308301-55.3083Z" fill="#F5A623" opacity=".8"></path><path d="M663.699607 401.383399m55.3083 0l0 0q55.308301 0 55.308301 55.3083l0 497.774706q0 55.308301-55.308301 55.3083l0 0q-55.308301 0-55.3083-55.3083l0-497.774706q0-55.308301 55.3083-55.3083Z" fill="#F5A623" opacity=".6"></path><path d="M995.54941 124.841896m55.308301 0l0 0q55.308301 0 55.3083 55.308301l0 774.316208q0 55.308301-55.3083 55.3083l0 0q-55.308301 0-55.308301-55.3083l0-774.316208q0-55.308301 55.308301-55.308301Z" fill="#F5A623" opacity=".4"></path></symbol><symbol id="oicon-gitee" viewBox="0 0 1024 1024"><path d="M966.524718 400.672821H456.520205c-24.497231 0-44.347077 19.954872-44.347077 44.557128v133.540102c0 24.602256 19.849846 44.530872 44.347077 44.530872h288.295385c33.266872 0 44.320821 11.132718 44.347077 44.530872 0.026256 89.035487-50.884923 133.566359-133.041231 133.566359h-376.779487c-24.602256 0-44.530872-19.954872-44.530872-44.530872v-400.67282c0-73.780513 59.575795-133.592615 133.014974-133.592616h598.593641c24.470974 0 44.320821-19.928615 44.320821-44.504615V44.530872C1010.740513 19.928615 990.916923 0 966.419692 0H367.826051C171.979487 0 13.128205 159.455179 13.128205 356.168205v623.32718C13.128205 1004.045128 32.978051 1024 57.475282 1024h598.646154c196.187897 0 352.439795-170.325333 354.619077-367.327179 0.131282-11.106462 0.131282-200.33641 0.131282-211.442872a44.478359 44.478359 0 0 0-44.347077-44.530872z"></path></symbol><symbol id="oicon-world" viewBox="0 0 1024 1024"><path d="M921.6 204.8h-1.024A510.464 510.464 0 0 0 512 0C229.696 0 0 229.696 0 512s229.696 512 512 512c167.04 0 315.072-80.64 408.576-204.8h1.024v-1.28C985.6 732.416 1024 626.816 1024 512s-38.4-220.416-102.4-305.92V204.8zM358.4 891.456A409.984 409.984 0 0 1 102.4 512c0-17.408 1.408-34.432 3.52-51.2H153.6l51.2 102.4v102.4L307.2 768l51.2 51.2v72.256zM512 921.6a408.32 408.32 0 0 1-96.448-11.904L460.8 819.2l51.2-102.4V614.4H409.6l-51.2-51.2h-51.2L256 460.8l51.2-102.4 51.2-51.2 51.2-51.2 51.2-102.4v-47.68c16.768-2.112 33.792-3.52 51.2-3.52a407.04 407.04 0 0 1 256 90.368V256l-51.2 102.4 51.2 51.2v51.2l-102.4 51.2-51.2 52.032 51.2 50.368 51.2 51.2 51.2 102.4 33.472 33.472A408.32 408.32 0 0 1 512 921.6z"></path></symbol><symbol id="oicon-setting" viewBox="0 0 1162 1024"><path d="M1055.479204 128.810127H442.676311c-10.415913-55.551537-57.287523-97.21519-116.311031-97.21519-57.287523 0-105.895118 41.663653-116.31103 97.21519H53.815552c-10.415913 0-19.095841 8.679928-19.095841 20.831826s8.679928 20.831826 20.831826 20.831826h156.238698c10.415913 55.551537 57.287523 97.21519 116.311031 97.21519 57.287523 0 105.895118-41.663653 116.311031-97.21519h611.066907c12.151899 0 20.831826-8.679928 20.831827-20.831826s-8.679928-20.831826-20.831827-20.831826zM328.101266 224.289331c-41.663653 0-76.383363-34.719711-76.383364-76.383364 0-41.663653 34.719711-76.383363 76.383364-76.383363 41.663653 0 76.383363 34.719711 76.383363 76.383363 0 41.663653-34.719711 76.383363-76.383363 76.383364zM1055.479204 840.564195H637.106691c-10.415913-55.551537-57.287523-97.21519-116.311031-97.21519-57.287523 0-105.895118 41.663653-116.311031 97.21519H55.551537c-12.151899 0-20.831826 8.679928-20.831826 20.831827s8.679928 20.831826 20.831826 20.831826h348.933092c10.415913 55.551537 57.287523 97.21519 116.311031 97.21519 57.287523 0 105.895118-41.663653 116.311031-97.21519H1055.479204c12.151899 0 20.831826-8.679928 20.831827-20.831826 0-10.415913-8.679928-20.831826-20.831827-20.831827z m-534.683544 97.21519c-41.663653 0-76.383363-34.719711-76.383363-76.383363 0-41.663653 34.719711-76.383363 76.383363-76.383364 41.663653 0 76.383363 34.719711 76.383364 76.383364-1.735986 41.663653-34.719711 76.383363-76.383364 76.383363zM1055.479204 484.687161h-67.703435c-10.415913-55.551537-57.287523-97.21519-116.311031-97.21519-57.287523 0-105.895118 41.663653-116.311031 97.21519H55.551537c-12.151899 0-20.831826 8.679928-20.831826 20.831826s8.679928 20.831826 20.831826 20.831827h699.60217c10.415913 55.551537 57.287523 97.21519 116.311031 97.21519 57.287523 0 105.895118-41.663653 116.311031-97.21519h67.703435c12.151899 0 20.831826-8.679928 20.831827-20.831827s-8.679928-20.831826-20.831827-20.831826z m-184.014466 97.21519c-41.663653 0-76.383363-34.719711-76.383364-76.383364 0-41.663653 34.719711-76.383363 76.383364-76.383363 41.663653 0 76.383363 34.719711 76.383363 76.383363 0 41.663653-34.719711 76.383363-76.383363 76.383364z"></path></symbol></svg><div name="global_header" data-traceid="global_header" data-tracepid="global_header">
                <!-- global_header -->

<style type="text/css">
.editormd:not(.editormd-fullscreen) {
  z-index: 1 !important;
}
.osc-new-layout .ui.visible.uncover.sidebar {
  z-index: 3;
}
.osc-new-layout .entry-list-box .comments-box .comments-box__list1 .comment-list .comment-item__content img, 
.osc-new-layout .osc-comments-modal .comments-box .comments-box__list .comment-list .comment-item__content img {
  max-width: 100%;
  height: auto;
}
.page-web-new-index .index-container .panel-box--recommend-user .user-list-box--column .user-item__header a {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
}
.osc-new-layout.page-web-new-index .index-container .channel-container .sidebar-box__inner .sidebar-section.section-gitee-update .project-update-box .project-update-list .project-update-item__header .name {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
    max-width: 130px;
    vertical-align: -0.28em;
}

/*
.index-tweets-widget .tweet-item > .content-wrap .content .text,
.tweet-detail-page .tweet-comments .comment .content>.text,
.space-home .space-list-container .item .description { overflow: hidden; }

body {
  filter: grayscale(100%);
  -webkit-filter: grayscale(100%);
  -moz-filter: grayscale(100%);
  -ms-filter: grayscale(100%);
  -o-filter: grayscale(100%);
  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
  filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
  -webkit-filter: grayscale(1);
}

@media only screen and (min-width: 768px) {
  .page-web-index {
    min-width: 1200px;
    overflow-x: hidden !important;
  }
}
*/
</style>
            </div>
            

        <val data-name="site_url" data-value="https://www.oschina.net"></val>      <val data-name="space_user_url" data-value="https://my.oschina.net/u/2590759"></val>      <val data-name="space_user_id" data-value="2590759"></val>      <val data-name="g_user_url" data-value=""></val>      <val data-name="api_prefix" data-value="/action"></val>      <val data-name="g_user_code" data-value=""></val>     <val data-name="g_user_id" data-value=""></val>     <val data-name="g_user_bind_phone" data-value="false"></val>     <val data-name="g_user_name" data-value=""></val>     <val data-name="g_user_small_portrait" data-value="https://www.oschina.net/new-osc/img/portrait.gif"></val>     <val data-name="g_user_large_portrait" data-value="https://www.oschina.net/new-osc/img/portrait.gif"></val>     <val data-name="g_user_osc_staff" data-value="false"></val>     <val data-name="login_page" data-value="https://www.oschina.net/home/login?goto_page=https%3A%2F%2Fmy.oschina.net%2Fu%2F2590759%2Fblog%2F3012574"></val> 
                <val data-name="weixinAppId" data-value="wx880def15e694b905"></val>
        <val data-name="weixinTimestamp" data-value="1638590787881"></val>
        <val data-name="weixinNonceStr" data-value="c760651a-6d07-491a-bf78-40828189de41"></val>
        <val data-name="weixinSignature" data-value="4778f7dbff6e43850c81b398669ff22e6b223a24"></val>
        <val data-name="weixinShareUrl" data-value="https://my.oschina.net/u/2590759/blog/3012574"></val>                             
                <val data-name="is_detail_page" data-value="true"></val>

        <val data-name="fixedHeaderHeight" data-value="45"></val>
        <val data-name="secondaryHeaderEnable" data-value="true"></val>

        <val data-name="rocommendGrayStatus" data-value="true"></val> 
        
    <div class="pusher">
                        
                                                                <div class="small-header-box small-header-box--fixed small-header-box--default-simple">
                <div class="small-header-box__wrapper">
                    <div class="small-header-box__inner">
                        <div class="main-bar">
                            <div class="main-bar__inner">
                                                                <div class="main-bar__row main-bar__row--simple">
                                                                                        <div class="nav-bar" role="navigation">
                    <ul class="nav-bar__tabs">
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/" class="tabs-link home">首页</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/news" class="tabs-link news">资讯</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://gitee.com/oschina/gotc-open-source-gallery?fr=osc" target="_blank" class="tabs-link gallery">开源长廊</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/groups" class="tabs-link group">专区</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/question" class="tabs-link question">问答</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/event" class="tabs-link event">活动</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/project" class="tabs-link project">软件库</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/explore" class="tabs-link explore">发现</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/blog" class="tabs-link blog">博客</a>
                        </li>
                                                <li class="tabs-item tabs-item--new tabs-item--new-show">
                            <a href="https://gitee.com/explore?utm_source=oschina&amp;utm_medium=link-index&amp;utm_campaign=home" target="_blank" class="tabs-link gitee">码云</a>
                        </li>
                    </ul>
                </div>
            
                                </div>
                                                                <div class="main-bar__row main-bar__row--full">
                                                                        <div class="head-bar">
                                        <a class="logo" href="https://www.oschina.net/" aria-label="OSCHINA" title="OSCHINA"><img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/logo_new.svg" alt="OSCHINA"></a>
                                    </div>
                                                                                        <div class="nav-bar" role="navigation">
                    <ul class="nav-bar__tabs">
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/" class="tabs-link home">首页</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/news" class="tabs-link news">资讯</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://gitee.com/oschina/gotc-open-source-gallery?fr=osc" target="_blank" class="tabs-link gallery">开源长廊</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/groups" class="tabs-link group">专区</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/question" class="tabs-link question">问答</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/event" class="tabs-link event">活动</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/project" class="tabs-link project">软件库</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/explore" class="tabs-link explore">发现</a>
                        </li>
                        <li class="tabs-item">
                            <a href="https://www.oschina.net/blog" class="tabs-link blog">博客</a>
                        </li>
                                                <li class="tabs-item tabs-item--new tabs-item--new-show">
                            <a href="https://gitee.com/explore?utm_source=oschina&amp;utm_medium=link-index&amp;utm_campaign=home" target="_blank" class="tabs-link gitee">码云</a>
                        </li>
                    </ul>
                </div>
            
                                                                        <div class="search-box">
                                        <form action="https://www.oschina.net/search" role="search">
                                            <div class="search-box__inner">
                                                                                                <input type="hidden" name="identification" value="1638590787881">
                                                <input type="hidden" name="scope" value="blog">
                                                <input class="search-box__input" aria-label="搜索" placeholder="大家都在搜..." name="q" value="" type="text" required="">
                                                <button type="submit" class="search-box__button"><i class="search icon"></i></button>
                                            </div>
                                        </form>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="user-bar">
                            <ul class="user-bar__links">
                                                                <a class="item icon app-download" href="https://www.oschina.net/app" target="_blank" title="下载APP"><i class="oicon oicon-phone"></i></a>

                                                                    <a class="item" href="https://www.oschina.net/home/login?goto_page=https%3A%2F%2Fmy.oschina.net%2Fu%2F2590759%2Fblog%2F3012574">登录</a>
                                    <a class="item" href="https://www.oschina.net/home/reg?goto_page=https%3A%2F%2Fmy.oschina.net%2Fu%2F2590759%2Fblog%2F3012574">注册</a>
                                                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        
                
                <div class="secondary-header-box">
            <div class="secondary-header-box__inner">
                <div class="secondary-header-box__channel">
                                            <div class="secondary-header-box__title"><a href="https://www.oschina.net/blog" title="开源博客">开源博客</a></div>
                                    </div>
                <div class="secondary-header-box__nav">
                                    </div>
                                    <div class="secondary-header-box__extra">
                            <a class="btn primary" href="https://www.oschina.net/home/go?page=blog%2Fwrite" target="_blank"><i class="oicon oicon-add"></i>写博客</a>

                    </div>
                                <div class="secondary-header-box__search">
                    <div class="search-box">
                        <form action="https://www.oschina.net/search" role="search">
                            <div class="search-box__inner">
                                                                <input type="hidden" name="identification" value="1638590787881">
                                <input type="hidden" name="scope" value="blog">
                                <input class="search-box__input" aria-label="搜索" placeholder="大家都在搜..." name="q" value="" type="text" required="">
                                <button type="submit" class="search-box__button"><i class="search icon"></i></button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
        
                <div id="mainScreen">
                                    <style>.notice a:hover{ color:#666 !important;cursor:pointer;}</style>
<div class="notice" id="noticeNormal" style="width: 100%; height: 32px; background: url(&quot;https://oscimg.oschina.net/oscnet/up-8eea8398844fe488fae348cfb118d8a226b.png&quot;) 0% 0% / 1920px 32px; display: flex; justify-content: center;">
    <div style="margin-top: 7px;display: flex;align-items: center;justify-content: space-between;width: 100%;">
        <div style="width: 100%;display: flex;align-items: center; justify-content: center;min-width: 430px;">
            <svg id="ey5hoejjf5d1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" style="width: 16px; height: 16px; margin-right: 10px; color: #77C596;"><style>#ey5hoejjf5d5 {animation: ey5hoejjf5d5_c_o 1000ms linear infinite normal forwards}@keyframes ey5hoejjf5d5_c_o { 0% {opacity: 0} 30% {opacity: 0} 60% {opacity: 1} 100% {opacity: 1} }#ey5hoejjf5d6 {animation: ey5hoejjf5d6_c_o 1000ms linear infinite normal forwards}@keyframes ey5hoejjf5d6_c_o { 0% {opacity: 0} 30% {opacity: 1} 100% {opacity: 1} }</style><g id="ey5hoejjf5d2"><path id="ey5hoejjf5d3" d="M0,0L16,0L16,16L0,16Z" opacity="0" fill="currentColor" fill-opacity="0" stroke="none" stroke-width="1"></path><path id="ey5hoejjf5d4" d="M10,2.833333C10,2.114000,9.150667,1.733333,8.613333,2.210667L5.618000,4.872667C5.526576,4.954116,5.408443,4.999186,5.286000,4.999333L2.833333,4.999333C2.004906,4.999333,1.333333,5.670906,1.333333,6.499333L1.333333,9.497333C1.333333,10.325760,2.004906,10.997333,2.833333,10.997333L5.286667,10.997333C5.409110,10.997480,5.527243,11.042551,5.618667,11.124000L8.612667,13.786667C9.150000,14.264000,10,13.882667,10,13.164000Z" fill="currentColor" stroke="none" stroke-width="1"></path><path id="ey5hoejjf5d5" d="M12.661333,3.931333C12.767949,3.852473,12.901527,3.819196,13.032678,3.838825C13.163829,3.858454,13.281811,3.929380,13.360667,4.036000C14.210786,5.182594,14.668755,6.572633,14.666674,8C14.668515,9.427435,14.210314,10.817466,13.360000,11.964000C13.192545,12.175676,12.887316,12.216246,12.670381,12.055660C12.453447,11.895075,12.403116,11.591303,12.556667,11.369333C13.279481,10.394870,13.668749,9.213275,13.666667,8C13.668748,6.786725,13.279481,5.605130,12.556667,4.630667C12.477806,4.524051,12.444530,4.390473,12.464159,4.259322C12.483788,4.128171,12.554714,4.010189,12.661333,3.931333Z" opacity="0" fill="currentColor" stroke="none" stroke-width="1"></path><path id="ey5hoejjf5d6" d="M11.428667,5.580000C11.545349,5.516812,11.682362,5.502597,11.809531,5.540485C11.936700,5.578373,12.043593,5.665256,12.106667,5.782000C12.464000,6.442000,12.666672,7.198667,12.666672,8.000667C12.667778,8.775330,12.475279,9.537990,12.106667,10.219333C11.975223,10.462339,11.671672,10.552777,11.428667,10.421333C11.185661,10.289890,11.095223,9.986339,11.226667,9.743333C11.506667,9.225333,11.666667,8.632667,11.666667,8.000667C11.666667,7.368667,11.506667,6.776000,11.226667,6.258000C11.163479,6.141318,11.149263,6.004304,11.187151,5.877136C11.225039,5.749967,11.311923,5.643074,11.428667,5.580000Z" opacity="0" fill="currentColor" stroke="none" stroke-width="1"></path></g></svg>
            <a href="https://wj.qq.com/s2/9352962/6110" target="_blank" style="color: #888888;font-size: 13px;font-weight: 400;line-height: 16px;max-width: 1130px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;">OSCHINA 2021 中国开源开发者问卷 &gt;&gt;&gt;&gt;&gt;&gt;</a>
        </div>
        <img class="close" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/up-f1efb7adeca2457da597a7e9d2ebe4d5be5.png" style="width: 14px;height: 14px;cursor: pointer;margin-right: 8px;">
    </div>
</div>
<script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/js.cookie.min.js.下载"></script>
<script type="text/javascript">
    $(function () {
        var bannerEl   = $('#noticeNormal');
        var cookieName = 'notice_normal_2021060201';
        function showBanner() {
            document.getElementById('noticeNormal').style.display='flex';
            setTimeout(function () {
                window.page && page.refreshAsideSticky && page.refreshAsideSticky();
                bannerEl.on('click', '.close', function (e) {
                    e.stopPropagation();
                    $('#noticeNormal').remove();
                    Cookies.set(cookieName, 1, {expires: 90, path: '/'});
                });
            }, 500);
        }
        if (!Cookies.get(cookieName)) {
            showBanner();
        }
    });
</script>
                            
            <div class="home-container">
                







                        
  



           












<script type="text/x-mathjax-config;executed=true">
    MathJax.Hub.Config({
      tex2jax: {inlineMath: [["$","$"],["$$","$$"],["\\(","\\)"]]}
    });
</script>

<script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/MathJax.js.下载"></script>

<x-foo-define data-define="space-new-blog-detail"></x-foo-define> 
<val data-name="objType" data-value="3"></val> <val data-name="objId" data-value="3012574"></val> <val data-name="author_id" data-value="2590759"></val> <val data-name="space_user_id" data-value="2590759"></val> 

<val data-name="commentsCount" data-value="0"></val>   <val data-name="fetchCommentsUrl" data-value="?type=comments"></val>              <val data-name="publishCommentUrl" data-value="/space/blog/add_comment"></val>    <val data-name="replyCommentUrl" data-value="/space/blog/add_comment"></val>      <val data-name="deleteCommentUrl" data-value="/space/blog/delete_blog_comments"></val>  
<val data-name="shareTitle" data-value="验证码识别技术——CNN+BLSTM+CTC从训练到部署 - kerlomz的个人空间 - OSCHINA"></val>
<val data-name="shareDesc" data-value="项目地址：https://github.com/kerlomz/captcha_trainer 1. 前言 本项目适用于Python3.6，GPU&gt;=NVIDIA GTX1050Ti，原master分支已经正式切换为CNN+LSTM+CTC的版本了，是时候写一篇新的文章了。 长话短说，开门见山..."></val>
<val data-name="shareUrl" data-value="https://my.oschina.net/u/2590759/blog/3012574"></val>
<val data-name="sharePic" data-value="https://oscimg.oschina.net/oscnet/10905998-8a9a864d93ecbcbe.png"></val>

<val data-name="weixinShareTitle" data-value="验证码识别技术——CNN+BLSTM+CTC从训练到部署"></val> <val data-name="weixinShareImgUrl" data-value="https://oscimg.oschina.net/oscnet/up-ccdf72787b19bc6396a1dbf8a7af432482b.png"></val> 
<val data-name="isPending" data-value="false"></val> 
<val data-name="weixinLogin" data-value="https://www.oschina.net/action/openid/before_bind?op=wechat_auto&amp;goto=https%3A%2F%2Fmy.oschina.net%2Fu%2F2590759%2Fblog%2F3012574"></val>

<div class="blog-detail-container">
        <div class="detail-body-box" style="min-height: 1162px;">
        <div class="box-container box-container--breadcrumb">
                        <div class="breadcrumb-box">
                <a class="item" href="https://my.oschina.net/u/2590759" target="_blank">kerlomz的个人空间</a>
                                                    <i class="split">/</i>
                    <a class="item" href="https://my.oschina.net/u/2590759?tab=newest&amp;catalogId=3763977" target="_blank">工作日志</a>
                                <i class="split">/</i>
                <div class="item">正文</div>
            </div>
        </div>

        <div class="box-container">
                        <div class="main-box">
                <div class="main-box__inner">
                                                                                            
                                        <div class="article-box box-card box-card--shadow">
                        <div class="article-box__inner">
                                                        <div class="article-box__header">
                                                                                                <h1 class="article-box__title">
                                    <a href="https://my.oschina.net/u/2590759/blog/3012574" target="_blank">验证码识别技术——CNN+BLSTM+CTC从训练到部署</a></h1>
                                                                <div class="article-box__meta">
                                    <div class="item-list">
                                                                                                                            <div class="item"><span class="label">原创</span></div>
                                                                                <div class="item"><a href="https://my.oschina.net/u/2590759" target="_blank">kerlomz</a></div>
                                                                                                                            <div class="item"><a class="link--default" href="https://my.oschina.net/u/2590759?tab=newest&amp;catalogId=3763977">工作日志</a></div>
                                                                                <div class="item lm">2019/02/20 17:44</div>
                                        <div class="item lm">阅读数 1.6W</div>
                                                                                                                    </div>
                                </div>

                                                                                                    <div class="article-box__group">
                                        <div class="group-card">
                                            <div class="group-card__inner">
                                                <div class="group-card__icon">
                                                    <a href="https://www.oschina.net/group/ai-bigdata" target="_blank" title="AI &amp; 大数据">
                                                        <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/31180557_CtYD.png" alt="">
                                                    </a>
                                                </div>
                                                <div class="group-card__info">
                                                    <div class="group-card__desc">本文被收录于专区</div>
                                                    <div class="group-card__name"><a href="https://www.oschina.net/group/ai-bigdata" target="_blank" title="AI &amp; 大数据">AI &amp; 大数据</a></div>
                                                </div>
                                                <div class="group-card__extra">
                                                    <a href="https://www.oschina.net/group/ai-bigdata" target="_blank" title="AI &amp; 大数据">进入专区参与更多专题讨论 <i class="oicon oicon-arrow-right"></i></a>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                                            </div>

                                                        <div class="article-box__content">
                                                                                                <div class="detail-box">
                                    <div class="article-detail">
                                        <div class="content">
                                                                                                                                                                                        <p><strong>项目地址：<a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fkerlomz%2Fcaptcha_trainer" target="_blank" rel="nofollow">https://github.com/kerlomz/captcha_trainer</a></strong></p> 
<span id="OSC_h2_1"></span> 
<h2>1. 前言</h2> 
<p>本项目适用于Python3.6，GPU&gt;=NVIDIA GTX1050Ti，原master分支已经正式切换为CNN+LSTM+CTC的版本了，是时候写一篇新的文章了。</p> 
<p><strong>长话短说，开门见山，</strong>网络上现有的代码以教学研究为主，本项目是为实用主义者定制的，只要基本的环境安装常识，便可很好的训练出期望的模型，重定义几个简单的参数任何人都能使用机器学习技术训练一个商业化成品。</p> 
<p><strong>最新更新（2019/01/21）</strong>：<br> 如果对于DLL调用感兴趣或是其他语言的TensorFlow API感兴趣的移步以下两个项目：</p> 
<ol> 
 <li><a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fkerlomz%2Fcaptcha_library_c" target="_blank" rel="nofollow">https://github.com/kerlomz/captcha_library_c</a></li> 
 <li><a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fkerlomz%2Fcaptcha_demo_csharp" target="_blank" rel="nofollow">https://github.com/kerlomz/captcha_demo_csharp</a></li> 
</ol> 
<p>笔者选用的时下最为流行的CNN+BLSTM+CTC进行端到端的不定长验证码识别，代码中预留了DenseNet+BLSTM+CTC的选项，可以在配置中直接选用。首先，介绍个大概吧。</p> 
<table> 
 <tbody> 
  <tr> 
   <th>网格结构</th> 
   <th>predict-CPU</th> 
   <th>predict-GPU</th> 
   <th>模型大小</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td>CNN5+Bi-LSTM+H64+CTC</td> 
   <td>15ms</td> 
   <td>28ms</td> 
   <td>2mb</td> 
  </tr> 
  <tr> 
   <td>CNN5+Bi-LSTM+H16+CTC</td> 
   <td>8ms</td> 
   <td>28ms</td> 
   <td>1.5mb</td> 
  </tr> 
  <tr> 
   <td>DenseNet+Bi-LSTM+H64+CTC</td> 
   <td>60ms</td> 
   <td>60ms</td> 
   <td>6.5mb</td> 
  </tr> 
 </tbody> 
</table> 
<p>H16/H64指的是Bi-LSTM的隐藏神经元个数num_units，这里注意，你没有看错，也没有写反，LSTM有时序依赖，tf.contrib.rnn.LSTMCell的实现没能很充分的利用GPU的计算资源，底层kernel函数之间的间隙非常大，不利于充分的利用 GPU 的并行性来进行计算。所以本项目使用GPU训练，使用CPU进行预测。预测服务部署项目源码请移步此处：<strong><a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fkerlomz%2Fcaptcha_platform" target="_blank" rel="nofollow">https://github.com/kerlomz/captcha_platform</a></strong></p> 
<span id="OSC_h2_2"></span> 
<h2>2.环境依赖：</h2> 
<p>关于CUDA和cuDNN版本的问题，不少人很纠结，这里就列出官方通过pip安装的TensorFlow的版本对应表：</p> 
<span id="OSC_h3_3"></span> 
<h3>Linux</h3> 
<table> 
 <tbody> 
  <tr> 
   <th>Version</th> 
   <th>Python version</th> 
   <th>Compiler</th> 
   <th>Build tools</th> 
   <th>cuDNN</th> 
   <th>CUDA</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td>tensorflow_gpu-1.12.0</td> 
   <td>2.7, 3.3-3.6</td> 
   <td>GCC 4.8</td> 
   <td>Bazel 0.15.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.11.0</td> 
   <td>2.7, 3.3-3.6</td> 
   <td>GCC 4.8</td> 
   <td>Bazel 0.15.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.10.0</td> 
   <td>2.7, 3.3-3.6</td> 
   <td>GCC 4.8</td> 
   <td>Bazel 0.15.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.9.0</td> 
   <td>2.7, 3.3-3.6</td> 
   <td>GCC 4.8</td> 
   <td>Bazel 0.11.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.8.0</td> 
   <td>2.7, 3.3-3.6</td> 
   <td>GCC 4.8</td> 
   <td>Bazel 0.10.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.7.0</td> 
   <td>2.7, 3.3-3.6</td> 
   <td>GCC 4.8</td> 
   <td>Bazel 0.9.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.6.0</td> 
   <td>2.7, 3.3-3.6</td> 
   <td>GCC 4.8</td> 
   <td>Bazel 0.9.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
 </tbody> 
</table> 
<span id="OSC_h3_4"></span> 
<h3>Windows</h3> 
<table> 
 <tbody> 
  <tr> 
   <th>Version</th> 
   <th>Python version</th> 
   <th>Compiler</th> 
   <th>Build tools</th> 
   <th>cuDNN</th> 
   <th>CUDA</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td>tensorflow_gpu-1.12.0</td> 
   <td>3.5-3.6</td> 
   <td>MSVC 2015 update 3</td> 
   <td>Bazel 0.15.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.11.0</td> 
   <td>3.5-3.6</td> 
   <td>MSVC 2015 update 3</td> 
   <td>Bazel 0.15.0</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.10.0</td> 
   <td>3.5-3.6</td> 
   <td>MSVC 2015 update 3</td> 
   <td>Cmake v3.6.3</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.9.0</td> 
   <td>3.5-3.6</td> 
   <td>MSVC 2015 update 3</td> 
   <td>Cmake v3.6.3</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.8.0</td> 
   <td>3.5-3.6</td> 
   <td>MSVC 2015 update 3</td> 
   <td>Cmake v3.6.3</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.7.0</td> 
   <td>3.5-3.6</td> 
   <td>MSVC 2015 update 3</td> 
   <td>Cmake v3.6.3</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
  <tr> 
   <td>tensorflow_gpu-1.6.0</td> 
   <td>3.5-3.6</td> 
   <td>MSVC 2015 update 3</td> 
   <td>Cmake v3.6.3</td> 
   <td>7</td> 
   <td>9</td> 
  </tr> 
 </tbody> 
</table> 
<p>如果希望使用上面对应之外的搭配的CUDA和cuDNN，可以自行编译TensorFlow，或者去Github上搜索<code>TensorFlow Wheel</code>找到第三方编译的对应版本的whl安装包。提前预警，若是自己编译将会苦难重重，坑很多，这里就不展开了。</p> 
<span id="OSC_h3_5"></span> 
<h3>2.1 本项目环境依赖</h3> 
<p><strong>目前在以下主流操作系统平台均测试通过：</strong></p> 
<table> 
 <tbody> 
  <tr> 
   <th>操作系统</th> 
   <th>最低支持版本</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td>Ubuntu</td> 
   <td>16.04</td> 
  </tr> 
  <tr> 
   <td>Windows</td> 
   <td>7 SP1</td> 
  </tr> 
  <tr> 
   <td>MacOS</td> 
   <td>N/A</td> 
  </tr> 
 </tbody> 
</table> 
<p><strong>本训练项目主要的环境依赖清单如下</strong></p> 
<table> 
 <tbody> 
  <tr> 
   <th>依赖</th> 
   <th>最低支持版本</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td>Python</td> 
   <td>3.6</td> 
  </tr> 
  <tr> 
   <td>TensorFlow-GPU</td> 
   <td>1.6.0</td> 
  </tr> 
  <tr> 
   <td>Opencv-Python</td> 
   <td>3.3.0.10</td> 
  </tr> 
  <tr> 
   <td>Numpy</td> 
   <td>1.14.1</td> 
  </tr> 
  <tr> 
   <td>Pillow</td> 
   <td>4.3.0</td> 
  </tr> 
  <tr> 
   <td>PyYaml</td> 
   <td>3.13</td> 
  </tr> 
 </tbody> 
</table> 
<span id="OSC_h4_6"></span> 
<h4>2.1.1 Ubuntu 16.04 下的 Python 3.6</h4> 
<p><strong>1）先安装Python环境</strong></p> 
<pre class="hljs sql"><code>sudo apt-get <span class="hljs-keyword">install</span> openssl  
sudo apt-<span class="hljs-keyword">get</span> <span class="hljs-keyword">install</span> libssl-dev
sudo apt-<span class="hljs-keyword">get</span> <span class="hljs-keyword">install</span> libc6-dev gcc  
sudo apt-<span class="hljs-keyword">get</span> <span class="hljs-keyword">install</span> -y make <span class="hljs-keyword">build</span>-essential zlib1g-dev libbz2-dev libreadline-dev $ libsqlite3-dev wget curl llvm tk-dev 
wget https://www.python.org/<span class="hljs-keyword">ftp</span>/python/<span class="hljs-number">3.6</span><span class="hljs-number">.6</span>/Python<span class="hljs-number">-3.6</span><span class="hljs-number">.6</span>.tgz
tar -vxf Python<span class="hljs-number">-3.6</span><span class="hljs-number">.6</span>.tar.xz
cd Python<span class="hljs-number">-3.6</span><span class="hljs-number">.6</span>
./configure <span class="hljs-comment">--prefix=/usr/local  --enable-shared</span>
make -j8
sudo make <span class="hljs-keyword">install</span> -j8
</code></pre> 
<p>经过上面指令就安装好Python3.6环境了，如果提示找不到<code>libpython3.6m.so.1.0</code>就到/usr/local/lib路径下将该文件复制一份到/usr/lib和/usr/lib64路径下。<br> <strong>2）安装相关依赖（这一步Windows和Linux通用）</strong><br> 可以直接在项目路径下执行<code>pip3 install -r requirements.txt</code>安装所有依赖，注意这一步是安装在全局Python环境下的，强烈建议使用虚拟环境进行项目间的环境隔离，如<strong>Virtualenv</strong>或<strong>Anaconda</strong>等等。<br> 我一般使用的是Virtualenv，有修改代码需要的，建议安装PyCharm作为Python IDE</p> 
<pre class="hljs bash"><code>virtualenv -p /usr/bin/python3 venv <span class="hljs-comment"># venv is the name of the virtual environment.</span>
<span class="hljs-built_in">cd</span> venv/ <span class="hljs-comment"># venv is the name of the virtual environment.</span>
<span class="hljs-built_in">source</span> bin/activate <span class="hljs-comment"># to activate the current virtual environment.</span>
<span class="hljs-built_in">cd</span> captcha_trainer <span class="hljs-comment"># captcha_trainer is the project path.</span>
pip3 install -r requirements.txt
</code></pre> 
<span id="OSC_h4_7"></span> 
<h4>2.1.2 Ubuntu 16.04 下的 CUDA/cuDNN</h4> 
<p>网上看到过很多教程，我自己也部署过很多次，Ubuntu 16.04遇到的坑还是比较少的。14.04支持就没那么好，如果主板不支持关闭SecureBoot的话千万不要安装Desktop版，因为安装好之后一定会无限循环在登陆界面无法进入桌面。<br> 网上教程说要加驱动黑名单什么的我直接跳过了，亲测没那个必要。就简单的几步：<br> <strong>1. 下载好安装包</strong><br> 注意下载runfile类型的安装包，deb安装会自动安装默认驱动，极有可能导致登陆循环<br> NVIDIA 驱动下载：<a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.geforce.cn%2Fdrivers" target="_blank" rel="nofollow">https://www.geforce.cn/drivers</a><br> CUDA 下载地址：<a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdeveloper.nvidia.com%2Fcuda-downloads" target="_blank" rel="nofollow">https://developer.nvidia.com/cuda-downloads</a><br> cuDNN 下载地址：<a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fdeveloper.nvidia.com%2Fcudnn" target="_blank" rel="nofollow">https://developer.nvidia.com/cudnn</a>&nbsp;（需要注册NVIDIA账号且登陆，下载deb安装包）</p> 
<p><strong>2. 关闭图形界面</strong><br> Ctrl+alt+F1进入字符界面，关闭图形界面</p> 
<pre class="hljs properties"><code><span class="hljs-attr">sudo</span> <span class="hljs-string">service lightdm stop</span>
</code></pre> 
<p><strong>3. 安装Nvidia Driver</strong></p> 
<p>命令中的版本自己对应下载的版本改，在上面的下载地址根据自己的显卡型号下载最新版，切记是runfile格式的安装包。</p> 
<pre class="hljs perl"><code>sudo <span class="hljs-keyword">chmod</span> a+<span class="hljs-keyword">x</span> NVIDIA-Linux-x86_64-<span class="hljs-number">384.90</span>.run //获取执行权限
sudo ./NVIDIA-Linux-x86_64-<span class="hljs-number">384.90</span>.run –<span class="hljs-keyword">no</span>-<span class="hljs-keyword">x</span>-check –<span class="hljs-keyword">no</span>-nouveau-check –<span class="hljs-keyword">no</span>-opengl-files //安装驱动
</code></pre> 
<p>安装成功以后使用以下命令验证，如果显示显卡信息则表示安装成功</p> 
<pre class="hljs"><code>nvidia-smi
</code></pre> 
<p><strong>4. 安装CUDA</strong></p> 
<p>1）先安装一些系统依赖库</p> 
<pre class="hljs sql"><code>sudo apt-get <span class="hljs-keyword">install</span> freeglut3-dev <span class="hljs-keyword">build</span>-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
</code></pre> 
<ol> 
 <li>执行安装程序，按指示无脑继续就好了，<strong>如果提示是否安装驱动选不安装。</strong></li> 
</ol> 
<pre class="hljs css"><code><span class="hljs-selector-tag">sudo</span> <span class="hljs-selector-tag">sh</span> <span class="hljs-selector-tag">cuda_9</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.176_384</span><span class="hljs-selector-class">.81_linux</span><span class="hljs-selector-class">.run</span>
</code></pre> 
<p>安装完如果环境变量没配上去，就写到 ~/.bashrc 文件的尾部</p> 
<pre class="hljs ruby"><code>export PATH=<span class="hljs-regexp">/usr/local</span><span class="hljs-regexp">/cuda-9.0/bin</span>${<span class="hljs-symbol">PATH:</span>+<span class="hljs-symbol">:</span>${PATH}}
export LD_LIBRARY_PATH=<span class="hljs-regexp">/usr/local</span><span class="hljs-regexp">/cuda-9.0/lib</span>64${<span class="hljs-symbol">LD_LIBRARY_PATH:</span>+<span class="hljs-symbol">:</span>${LD_LIBRARY_PATH}}
</code></pre> 
<p>然后在终端执行&nbsp;<code>sudo ldconfig</code>更新，安装完毕就可以重启机器重启图形界面了。</p> 
<pre class="hljs properties"><code><span class="hljs-attr">sudo</span> <span class="hljs-string">service lightdm start</span>
</code></pre> 
<span id="OSC_h4_8"></span> 
<h4>2.1.3 Windows 系统</h4> 
<p>在Windows其实简单很多，只要到官网下载安装包无脑安装就可以了，下载连接同Ubuntu，先安装Python，显卡驱动，CUDA，然后下载对应的cuDNN替换到对应路径即可。</p> 
<p><strong>花了超长篇幅介绍了训练环境的基本搭建，主要是给尚未入门的读者看的，老鸟们随便跳过</strong></p> 
<span id="OSC_h2_9"></span> 
<h2>3 使用</h2> 
<p>入手的第一步环境搭建好了，那就是准备跑代码了，还是有几个必要的条件，巧妇难为无米之炊，首先，既然是训练，要先有训练集，有一个新手尝鲜的训练集，是mnist手写识别的例子，可以在腾讯云下载：<a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fshare.weiyun.com%2F5pzGF4V" target="_blank" rel="nofollow">https://share.weiyun.com/5pzGF4V</a>，现在万事俱备，只欠东风。</p> 
<span id="OSC_h3_10"></span> 
<h3>3.1 定义一个模型</h3> 
<p>本项目采用的是参数化配置，不需要改动任何代码，可以训练几乎任何字符型图片验证码，下面从两个配置文件说起：<br> <code>config.yaml # 系统配置</code></p> 
<pre class="hljs yaml"><code><span class="hljs-comment"># - requirement.txt  -  GPU: tensorflow-gpu, CPU: tensorflow</span>
<span class="hljs-comment"># - If you use the GPU version, you need to install some additional applications.</span>
<span class="hljs-comment"># TrainRegex and TestRegex: Default matching apple_20181010121212.jpg file.</span>
<span class="hljs-comment"># - The Default is .*?(?=_.*\.)</span>
<span class="hljs-comment"># TrainsPath and TestPath: The local absolute path of your training and testing set.</span>
<span class="hljs-comment"># TestSetNum: This is an optional parameter that is used when you want to extract some of the test set</span>
<span class="hljs-comment"># - from the training set when you are not preparing the test set separately.</span>
<span class="hljs-attr">System:</span>
  <span class="hljs-attr">DeviceUsage:</span> <span class="hljs-number">0.7</span>
  <span class="hljs-attr">TrainsPath:</span> <span class="hljs-string">'E:\Task\Trains\YourModelName\'
  TrainRegex: '</span><span class="hljs-string">.*?(?=_)'</span>
  <span class="hljs-attr">TestPath:</span> <span class="hljs-string">'E:\Task\TestGroup\YourModelName\'
  TestRegex: '</span><span class="hljs-string">.*?(?=_)'</span>
  <span class="hljs-attr">TestSetNum:</span> <span class="hljs-number">1000</span>

<span class="hljs-comment"># CNNNetwork: [CNN5, DenseNet]</span>
<span class="hljs-comment"># RecurrentNetwork: [BLSTM, LSTM]</span>
<span class="hljs-comment"># - The recommended configuration is CNN5+BLSTM / DenseNet+BLSTM</span>
<span class="hljs-comment"># HiddenNum: [64, 128, 256]</span>
<span class="hljs-comment"># - This parameter indicates the number of nodes used to remember and store past states.</span>
<span class="hljs-attr">NeuralNet:</span>
  <span class="hljs-attr">CNNNetwork:</span> <span class="hljs-string">CNN5</span>
  <span class="hljs-attr">RecurrentNetwork:</span> <span class="hljs-string">BLSTM</span>
  <span class="hljs-attr">HiddenNum:</span> <span class="hljs-number">64</span>
  <span class="hljs-attr">KeepProb:</span> <span class="hljs-number">0.98</span>

<span class="hljs-comment"># SavedSteps: A Session.run() execution is called a Steps,</span>
<span class="hljs-comment"># - Used to save training progress, Default value is 100.</span>
<span class="hljs-comment"># ValidationSteps: Used to calculate accuracy, Default value is 100.</span>
<span class="hljs-comment"># TestNum: The number of samples for each test batch.</span>
<span class="hljs-comment"># - A test for every saved steps.</span>
<span class="hljs-comment"># EndAcc: Finish the training when the accuracy reaches [EndAcc*100]%.</span>
<span class="hljs-comment"># EndEpochs: Finish the training when the epoch is greater than the defined epoch.</span>
<span class="hljs-attr">Trains:</span>
  <span class="hljs-attr">SavedSteps:</span> <span class="hljs-number">100</span>
  <span class="hljs-attr">ValidationSteps:</span> <span class="hljs-number">500</span>
  <span class="hljs-attr">EndAcc:</span> <span class="hljs-number">0.975</span>
  <span class="hljs-attr">EndEpochs:</span> <span class="hljs-number">1</span>
  <span class="hljs-attr">BatchSize:</span> <span class="hljs-number">64</span>
  <span class="hljs-attr">TestBatchSize:</span> <span class="hljs-number">400</span>
  <span class="hljs-attr">LearningRate:</span> <span class="hljs-number">0.01</span>
  <span class="hljs-attr">DecayRate:</span> <span class="hljs-number">0.98</span>
  <span class="hljs-attr">DecaySteps:</span> <span class="hljs-number">10000</span>
</code></pre> 
<p>上面看起来好多好多参数，其实大部分可以不用改动，你需要修改的仅仅是训练集路径就可以了，<strong>注意：如果训练集的命名格式和我提供的新手训练集不一样，请根据实际情况修改TrainRegex和TestRegex的正则表达式。</strong>，TrainsPath和TestPath路径支持list参数，允许多个路径，这种操作适用于需要将多种样本训练为一个模型，或者希望训练一套通用模型的人。为了加快训练速度，提高训练集读取效率，特别提供了make_dataset.py来支持将训练集打包为tfrecords格式输入，经过make_dataset.py打包之后的训练集将输出到本项目的dataset路径下，只需修改TrainsPath键的配置如下即可</p> 
<pre class="hljs less"><code><span class="hljs-attribute">TrainsPath</span>: <span class="hljs-string">'./dataset/xxx.tfrecords'</span>
</code></pre> 
<p>TestPath是允许为空的，如果TestPath为空将会使用TestSetNum参数自动划分出对应个数的测试集。如果使用自动划分机制，那么TestSetNum测试集总数参数必须大于等于TestBatchSize测试集每次读取的批次大小。<br> 神经网络这块可以讲一讲，默认提供的组合是CNN5(CNN5层模型)+BLSTM(Bidirectional LSTM)+CTC，亲测收敛最快，但是训练集过小，实际图片变化很大特征很多的情况下容易发生过拟合。DenseNet可以碰运气在样本量很小的情况下很好的训练出高精度的模型，为什么是碰运气呢，因为收敛快不快随机的初始权重很重要，运气好前500步可能对测试集就有40-60%准确率，运气不好2000步之后还是0，收敛快慢是有一定的运气成分的。</p> 
<pre class="hljs yaml"><code><span class="hljs-attr">NeuralNet:</span>
  <span class="hljs-attr">CNNNetwork:</span> <span class="hljs-string">CNN5</span>
  <span class="hljs-attr">RecurrentNetwork:</span> <span class="hljs-string">BLSTM</span>
  <span class="hljs-attr">HiddenNum:</span> <span class="hljs-number">64</span>
  <span class="hljs-attr">KeepProb:</span> <span class="hljs-number">0.99</span>
</code></pre> 
<p>隐藏层HiddenNum笔者尝试过8~64，都能控制在很小的模型大小之内，如果想使用DenseNet代替CNN5直接修改如上配置中的CNNNetwork参数替换为：</p> 
<pre class="hljs properties"><code><span class="hljs-attr">NeuralNet</span>:<span class="hljs-string"></span>
  <span class="hljs-attr">CNNNetwork</span>: <span class="hljs-string">DenseNet</span>
  <span class="hljs-attr">......</span>
</code></pre> 
<p><code>model.yaml # 模型配置</code></p> 
<pre class="hljs yaml"><code><span class="hljs-comment"># ModelName: Corresponding to the model file in the model directory,</span>
<span class="hljs-comment"># - such as YourModelName.pb, fill in YourModelName here.</span>
<span class="hljs-comment"># CharSet: Provides a default optional built-in solution:</span>
<span class="hljs-comment"># - [ALPHANUMERIC, ALPHANUMERIC_LOWER, ALPHANUMERIC_UPPER,</span>
<span class="hljs-comment"># -- NUMERIC, ALPHABET_LOWER, ALPHABET_UPPER, ALPHABET]</span>
<span class="hljs-comment"># - Or you can use your own customized character set like: ['a', '1', '2'].</span>
<span class="hljs-comment"># CharExclude: CharExclude should be a list, like: ['a', '1', '2']</span>
<span class="hljs-comment"># - which is convenient for users to freely combine character sets.</span>
<span class="hljs-comment"># - If you don't want to manually define the character set manually,</span>
<span class="hljs-comment"># - you can choose a built-in character set</span>
<span class="hljs-comment"># - and set the characters to be excluded by CharExclude parameter.</span>
<span class="hljs-attr">Model:</span>
  <span class="hljs-attr">Sites:</span> <span class="hljs-string">[]</span>
  <span class="hljs-attr">ModelName:</span> <span class="hljs-string">YourModelName-CNN5-H64-150x50</span>
  <span class="hljs-attr">ModelType:</span> <span class="hljs-string">150x50</span>
  <span class="hljs-attr">CharSet:</span> <span class="hljs-string">ALPHANUMERIC_LOWER</span>
  <span class="hljs-attr">CharExclude:</span> <span class="hljs-string">[]</span>
  <span class="hljs-attr">CharReplace:</span> <span class="hljs-string">{}</span>
  <span class="hljs-attr">ImageWidth:</span> <span class="hljs-number">150</span>
  <span class="hljs-attr">ImageHeight:</span> <span class="hljs-number">50</span>

<span class="hljs-comment"># Binaryzation: [-1: Off, &gt;0 and &lt; 255: On].</span>
<span class="hljs-comment"># Smoothing: [-1: Off, &gt;0: On].</span>
<span class="hljs-comment"># Blur: [-1: Off, &gt;0: On].</span>
<span class="hljs-comment"># Resize: [WIDTH, HEIGHT]  </span>
<span class="hljs-comment"># - If the image size is too small, the training effect will be poor and you need to zoom in.</span>
<span class="hljs-comment"># - ctc_loss error "No valid path found." happened</span>
<span class="hljs-attr">Pretreatment:</span>
  <span class="hljs-attr">Binaryzation:</span> <span class="hljs-number">-1</span>
  <span class="hljs-attr">Smoothing:</span> <span class="hljs-number">-1</span>
  <span class="hljs-attr">Blur:</span> <span class="hljs-number">-1</span>
</code></pre> 
<p>上述的配置只要关注<br> ModelName、CharSet、ImageWidth、ImageHeight<br> 首先给模型取一个好名字是成功的第一步，字符集CharSet其实大多数情况下不需要修改，一般的图形验证码离不开数字和英文，而且一般来说是大小写不敏感的，不区分大小写，因为打码平台收集的训练集质量参差不齐，有些大写有些小写，不如全部统一为小写，默认ALPHANUMERIC_LOWER则会自动将大写的转为小写，字符集可定制化很灵活，除了配置备注上提供的几种类型，还可以训练中文，自定义字符集用list表示，示例如下：</p> 
<pre class="hljs less"><code><span class="hljs-attribute">CharSet</span>: [<span class="hljs-string">'常'</span>, <span class="hljs-string">'世'</span>, <span class="hljs-string">'宁'</span>, <span class="hljs-string">'慢'</span>, <span class="hljs-string">'南'</span>, <span class="hljs-string">'制'</span>, <span class="hljs-string">'根'</span>, <span class="hljs-string">'难'</span>]
</code></pre> 
<p>可以自己根据收集训练集的实际字符集使用率来定义，也可以无脑网上找3500常用字来训练，<strong>注意：中文字符集一般比数字英文大很多，刚开始收敛比较慢，需要更久的训练时间，也需要更多的样本量，请量力而行</strong></p> 
<p><img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/10905998-8a9a864d93ecbcbe.png" class="zoom-in-cursor"></p> 
<p>QQ截图20181204150924.png</p> 
<p><br> <strong>形如上图的图片能轻松训练到95%以上的识别率。</strong><br> ImageWidth、ImageHeight只要和当前图片尺寸匹配即可，其实这里的配置主要是为了方便后面的部署智能策略。<br> 其他的如Pretreatment之下的参数是用来做图片预处理的，因为笔者致力于做一套通用模型，模型只使用了灰度做预处理。其中可选的二值化、均值滤波、高斯模糊均未开启，即使不进行那些预处理该框架已经能够达到很理想的识别效果了，笔者自用的大多数模型都是98%以上的识别率。</p> 
<p>&nbsp;</p> 
<span id="OSC_h3_11"></span> 
<h3>3.2 开始训练</h3> 
<p>按照上面的介绍，配置只要修改极少数的参数对应的值，就可以开启正式的训练之旅了，具体操作如下：<br> 可以直接使用PyCharm的Run，执行trains.py，也可以在激活Virtualenv下使用终端亦或在安装依赖的全局环境下执行</p> 
<pre class="hljs properties"><code><span class="hljs-attr">python3</span> <span class="hljs-string">trains.py</span>
</code></pre> 
<p>剩下的就是等了，看过程，等结果。<br> 正常开始训练的模样应该是这样的：</p> 
<p>&nbsp;</p> 
<p><img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/10905998-4a90e1a66bea8c8b.png" class="zoom-in-cursor"></p> 
<p>QQ截图20181204152301.png</p> 
<p>&nbsp;</p> 
<p>训练结束会在项目的out路径下生成一个pb和yaml文件，下面该到部署环节了。</p> 
<span id="OSC_h3_12"></span> 
<h3>3.3 部署</h3> 
<p>真的很有必要认真的介绍一下部署项目，比起训练，这个部署项目倾注了笔者更多的心血，为什么呢？<br> 项目地址：<a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fkerlomz%2Fcaptcha_platform" target="_blank" rel="nofollow">https://github.com/kerlomz/captcha_platform</a></p> 
<span id="OSC_h4_13"></span> 
<h4>真的值得了解的几点</h4> 
<ol> 
 <li>同时管理多个模型，支持模型热拔插</li> 
 <li>灵活的版本控制</li> 
 <li>支持批量识别</li> 
 <li>服务智能路由策略</li> 
</ol> 
<p><strong>首先笔者重写了Tensor Flow的Graph会话管理，设计会话池，允许同时管理多模型，实现多模型动态部署方案。</strong><br> <strong>1）</strong>训练好的pb模型只要放在部署项目的graph路径下，yaml模型配置文件放在model，即可被服务发现并加载，<br> <strong>2）</strong>如果需要卸载一个正在服务的模型，只需要在model中删除该模型的yaml配置文件，在graph中删除对应的pb模型即可。<br> <strong>3）</strong>如果需要更新一个已经服务中的模型，只需修改新版的模型yaml配置文件的版本号高于原模型的版本号，按先放pb后放yaml的顺序，服务便会自动发现新版的模型并加载使用，旧的模型将因版本低于新版模型不会被调用，可以按照上述的卸载方法卸载已被弃用的模型释放内存。<br> 上面的操作中无需重启服务，完全的无缝切换</p> 
<p>其次，一套服务想要服务于各式各样的图像识别需求，可以定义一套策略，训练时将所有尺寸一样的图片训练成一个模型，服务根据图片尺寸自动选择使用哪个模型，这样的设计使定制化和通用性共存，等积累到一定多样的训练集时可以将所有的训练集合到一起训练一个通用模型，亦可以彼此独立，每个模型的叠加仅仅增加了少量的内存或显存，网上的方案大多是不同的模型单独部署一套服务，每个进程加载了一整套TensorFlow框架势必是过于庞大和多余的。</p> 
<p>用到批量识别需求的人相对少很多这里就不展开介绍了。识别项目提供了多套可选的服务有：gRPC，Flask，Tornado，Sanic，其中Flask和Tornado提供了加密接口，类似于微信公众号开发接口的SecretKey和AccessKey接口，感兴趣的可以在demo.py中阅读调用源码了解。</p> 
<p>部署的使用可以经过package.py编译为可执行文件，这样可以免去更换机器环境安装的烦恼，部署项目安装流程同训练项目，项目中提供的requirements.txt已经将所需的依赖都列清楚了，强烈建议部署项目安装cpu版TensorFlow。</p> 
<p><strong>Linux：</strong></p> 
<ol> 
 <li>Tornado：</li> 
</ol> 
<pre class="hljs properties"><code><span class="hljs-comment"># 端口 19952</span>
<span class="hljs-attr">python3</span> <span class="hljs-string">tornado_server.py</span>
</code></pre> 
<ol> 
 <li>Flask</li> 
</ol> 
<pre class="hljs properties"><code><span class="hljs-comment"># 方案1，裸启动， 端口 19951</span>
<span class="hljs-attr">python</span> <span class="hljs-string">flask_server.py </span>
<span class="hljs-comment"># 方案2，使用gunicorn，端口 5000</span>
<span class="hljs-attr">pip</span> <span class="hljs-string">install gunicorn </span>
<span class="hljs-attr">gunicorn</span> <span class="hljs-string">-c deploy.conf.py flask_server:app</span>
</code></pre> 
<ol> 
 <li>Sanic：</li> 
</ol> 
<pre class="hljs properties"><code><span class="hljs-comment"># 端口 19953</span>
<span class="hljs-attr">python3</span> <span class="hljs-string">sanic_server.py</span>
</code></pre> 
<ol> 
 <li>gRPC:</li> 
</ol> 
<pre class="hljs properties"><code><span class="hljs-comment"># 端口 50054</span>
<span class="hljs-attr">python3</span> <span class="hljs-string">grpc_server.py</span>
</code></pre> 
<p><strong>Windows：</strong><br> Windows平台下都是通过<code>python3 xxx_server.py</code>启动对应的服务，注意，Tornado、Flask、Sanic的性能在Windows平台都大打折扣，gRPC是Google开源的RPC服务，有较为优越的性能。</p> 
<span id="OSC_h3_14"></span> 
<h3>3.4 调用/测试</h3> 
<p><strong>1. Flask服务：</strong></p> 
<table> 
 <tbody> 
  <tr> 
   <th>请求地址</th> 
   <th>Content-Type</th> 
   <th>参数形式</th> 
   <th>请求方法</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td><a href="https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Flocalhost%3A19951%2Fcaptcha%2Fv1" target="_blank" rel="nofollow">http://localhost:19951/captcha/v1</a></td> 
   <td>application/json</td> 
   <td>JSON</td> 
   <td>POST</td> 
  </tr> 
 </tbody> 
</table> 
<p><strong>具体参数：</strong></p> 
<table> 
 <tbody> 
  <tr> 
   <th>参数名</th> 
   <th>必选</th> 
   <th>类型</th> 
   <th>说明</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td>image</td> 
   <td>Yes</td> 
   <td>String</td> 
   <td>Base64 编码</td> 
  </tr> 
  <tr> 
   <td>model_site</td> 
   <td>No</td> 
   <td>String</td> 
   <td>网站名，yaml配置中可绑定</td> 
  </tr> 
  <tr> 
   <td>model_type</td> 
   <td>No</td> 
   <td>String</td> 
   <td>类别，yaml配置中可绑定</td> 
  </tr> 
 </tbody> 
</table> 
<p>请求为JSON格式，形如：{"image": "base64编码后的图像二进制流"}</p> 
<p><strong>返回结果：</strong></p> 
<table> 
 <tbody> 
  <tr> 
   <th>参数名</th> 
   <th>类型</th> 
   <th>说明</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td>message</td> 
   <td>String</td> 
   <td>识别结果或错误消息</td> 
  </tr> 
  <tr> 
   <td>code</td> 
   <td>String</td> 
   <td>状态码</td> 
  </tr> 
  <tr> 
   <td>success</td> 
   <td>String</td> 
   <td>是否请求成功</td> 
  </tr> 
 </tbody> 
</table> 
<p>该返回为JSON格式，形如：{"message": "xxxx", "code": 0, "success": true}</p> 
<p><strong>2. Tornado服务：</strong></p> 
<table> 
 <tbody> 
  <tr> 
   <th>请求地址</th> 
   <th>Content-Type</th> 
   <th>参数形式</th> 
   <th>请求方法</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td><a href="https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Flocalhost%3A19952%2Fcaptcha%2Fv1" target="_blank" rel="nofollow">http://localhost:19952/captcha/v1</a></td> 
   <td>application/json</td> 
   <td>JSON</td> 
   <td>POST</td> 
  </tr> 
 </tbody> 
</table> 
<p><strong>请求参数和返回格式同上</strong></p> 
<p><strong>3. Sanic服务：</strong></p> 
<table> 
 <tbody> 
  <tr> 
   <th>请求地址</th> 
   <th>Content-Type</th> 
   <th>参数形式</th> 
   <th>请求方法</th> 
  </tr> 
 </tbody> 
 <tbody> 
  <tr> 
   <td><a href="https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Flocalhost%3A19953%2Fcaptcha%2Fv1" target="_blank" rel="nofollow">http://localhost:19953/captcha/v1</a></td> 
   <td>application/json</td> 
   <td>JSON</td> 
   <td>POST</td> 
  </tr> 
 </tbody> 
</table> 
<p><strong>请求参数和返回格式同上</strong></p> 
<p><strong>4. gRPC服务：</strong><br> 需要安装依赖，grpcio、grpcio_tools和对应的grpc.proto文件，可以直接从项目中的示例代码demo.py中提取。</p> 
<pre class="hljs ruby"><code><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GoogleRPC</span>(<span class="hljs-title">object</span>):</span>

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, <span class="hljs-symbol">host:</span> str)</span></span>:
        <span class="hljs-keyword">self</span>._url = <span class="hljs-string">'{}:50054'</span>.format(host)
        <span class="hljs-keyword">self</span>.true_count = <span class="hljs-number">0</span>
        <span class="hljs-keyword">self</span>.total_count = <span class="hljs-number">0</span>

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">request</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, image, model_type=None, model_site=None)</span></span>:

        import grpc
        import grpc_pb2
        import grpc_pb2_grpc
        channel = grpc.insecure_channel(<span class="hljs-keyword">self</span>._url)
        stub = grpc_pb2_grpc.PredictStub(channel)
        response = stub.predict(grpc_pb2.PredictRequest(
            image=image, split_char=<span class="hljs-string">','</span>, model_type=model_type, model_site=model_site
        ))
        <span class="hljs-keyword">return</span> {<span class="hljs-string">"message"</span>: response.result, <span class="hljs-string">"code"</span>: response.code, <span class="hljs-string">"success"</span>: response.success}

<span class="hljs-keyword">if</span> __name_<span class="hljs-number">_</span> == <span class="hljs-string">'__main__'</span>:
    result = GoogleRPC().request(<span class="hljs-string">"base64编码后的图片二进制流"</span>)
    print(result)
</code></pre> 
<span id="OSC_h3_15"></span> 
<h3>3.5 奇技淫巧</h3> 
<p>该项目还可以直接用于识别带颜色的图片，本质是不同的颜色分别训练，调用的时候通过传参区分，如果希望获得图片中红色的文字，就直接通过参数定位到训练红色的模型，希望获取图片中蓝色的图片就通过参数定位到蓝色模型，如：</p> 
<p>&nbsp;</p> 
<p><img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/10905998-ddecbe7cd61a740d.png" class="zoom-in-cursor"></p> 
<p>蓝色.png</p> 
<p><img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/10905998-2f8a4be70a29682a.png" class="zoom-in-cursor"></p> 
<p>红色.png</p> 
<p>不过这种操作对样本量要求较高，且效率不高，当颜色参数越来越多时就不适用，可以采用颜色提取的方式，这样所需要的样本量将大大减少，但对于颜色提取算法效果要求高了。还有一种方案是同时预测验证码和每个字符对应的颜色，不过这需要修改现有的神经网络进行支持，在最后一层修改为双输出，一个输出颜色，一个输出对应字符，这对于样本标注的要求较高，也提高的成本，所以如果能用无限生成样本，那问题就迎刃而解了，比如上图，笔者就写了样本生成代码，感兴趣的可以移步：<br> <a href="https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.jianshu.com%2Fp%2Fda1b972e24f2" target="_blank" rel="nofollow">https://www.jianshu.com/p/da1b972e24f2</a><br> 其实还有很多很多技巧，例如，用生成的样本代替训练集，其实网上的图片验证码大多是采用开源的，稍作修改而已，大多数情况都能被近似生成出来，上述展示的验证码图片不代表任何实际的网站，如有雷同，纯属巧合，该项目只能用于学习和交流用途，不得用于非法用途。</p> 
<span id="OSC_h3_16"></span> 
<h3>后记</h3> 
<p>如果文章描述不够详尽或需要技术支持的，可以加群857149419咨询，或在开源项目中提issue，很荣幸能为开源社区贡献绵薄之力。</p>
                                        </div>
                                    </div>
                                    <div class="collapse-bar">
                                        <span class="collapse-btn">展开阅读全文 <i class="oicon oicon-arrow-down-light"></i></span>
                                    </div>
                                </div>

                                                                                                    <div class="tags-box">
                                        <div class="tags-box__inner">
                                            <a class="tag-item" href="https://www.oschina.net/p/ctc">CTC</a><a class="tag-item" href="https://www.oschina.net/p/yaml">YAML</a><a class="tag-item" href="https://www.oschina.net/p/bazel">Bazel</a><a class="tag-item" href="https://www.oschina.net/p/tornado">Tornado</a><a class="tag-item" href="https://www.oschina.net/p/tensorflow">TensorFlow</a>                                        </div>
                                    </div>
                                
                                                                <div class="copyright-box">
                                    <div class="copyright-box__content">
                                                                                    <p>© 著作权归作者所有</p>
                                                                            </div>
                                    <div class="copyright-box__extra">
                                        <span class="ban clickable" ban-report="" data-id="3012574" data-obj-type="3" data-url="https://my.oschina.net/u/2590759/blog/3012574"><i class="flag icon"></i>举报</span>
                                    </div>
                                </div>

                                                                <div class="action-box">
                                                                            <div class="action-item">
                                                                                        <div class="action-item__button donate" donate="" data-id="3012574" data-obj-type="16344358" data-subject="验证码识别技术——CNN+BLSTM+CTC从训练到部署" data-donater="" data-author="2590759" data-return-url="https://my.oschina.net/u/2590759/blog/3012574" data-notify-url="https://my.oschina.net/action/donate/paySuccess">                                                 <i class="oicon oicon-money-bold"></i>
                                            </div>
                                            <div class="action-item__text">打赏</div>
                                        </div>
                                                                        <div class="action-item">
                                                                                <div class="action-item__button like-btn toggle-article-like " data-id="3012574">
                                            <i class="oicon oicon-thumb-up"></i>
                                        </div>
                                        <div class="action-item__text"><span data-article-like-count="">0</span> 赞</div>
                                    </div>
                                    <div class="action-item">
                                                                                <div class="action-item__button collect-btn " data-id="3012574" data-user-id="2590759" data-obj-type="3" data-max="99" data-tag-required="" data-current-user-id="" data-recommend-tags="CTC,YAML,Bazel,Tornado,TensorFlow" data-uncollected-class="oicon oicon-star" data-collected-class="oicon oicon-star">
                                            <i class="oicon oicon-star"></i>
                                        </div>
                                        <div class="action-item__text"><span data-collect-count="" data-id="3012574" data-obj-type="3">0</span> 收藏</div>
                                    </div>
                                    <div class="action-item">
                                                                                <div class="osc-share ui dropdown bottom left pointing" data-tag="share-blog" tabindex="0">
                                            <div class="action-item__button"><i class="oicon oicon-share"></i></div>
                                            <div class="menu" tabindex="-1">
                                                <a class="item" data-platform="wechat" data-value="wechat"><i class="weixin icon"></i>微信</a>
                                                <a class="item" data-platform="qq" data-value="qq"><i class="qq icon"></i>QQ</a>
                                                <a class="item" data-platform="weibo" data-value="weibo"><i class="weibo icon"></i>微博</a>
                                            </div>
                                        </div>
                                        <div class="action-item__text">分享</div>
                                    </div>
                                </div>

                                                                                            </div>
                        </div>
                    </div>

                                                                                    <div class="comment-wrap-box box-card box-card--shadow" id="comments">
                            <div class="comment-wrap-box__inner">
                                                                <div class="comments-box">
        <div class="comments-box__loader ui inverted dimmer">
        <div class="loader-wrap">
            <div class="ui text loader">加载中</div>
        </div>
    </div>

    <div class="comments-box__inner">
                            <div id="commentForm" class="comments-box__form"><div class="comment-form-container"><div class="comment-avatar-wrap"><div class="osc-avatar small-portrait _40x40"><img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/portrait.gif" alt=""></div></div> <div class="comment-form-wrap"><form class="comment-form"><div class="textarea-wrap"><textarea aria-label="评论" placeholder="" maxlength="1000" class="disabled-resize"></textarea></div> <div class="footer-wrap"><div class="toolbar"></div> <div class="actions"><div class="osc-button fluid basic btn-action btn-cancel">取消</div> <div class="osc-button fluid primary btn-action btn-publish disabled">发布</div></div></div></form> <div class="ui mini message hidden" style="display: none;"><i class="icon info"></i> <span></span></div></div></div></div>
        
                <div class="comments-box__list">
                          


 
                                                                                     
 
        </div>

                <div class="collapse-bar">
            <span class="collapse-btn">更多评论 <i class="oicon oicon-arrow-down-light"></i></span>
        </div>
    </div>
</div>

                            </div>
                        </div>
                    
                                                        </div>
            </div>

                        <div class="sidebar-box">
                <div class="sidebar-box__inner" style="">
                                                                                            
                                        <div class="sidebar-section-list mb sidebar-section-list--compact box-card box-card--shadow">
                        <div class="sidebar-section section-author">
                            <div class="section-header">
                                <h3 class="section-title">关于作者</h3>
                            </div>
                            <div class="section-body">
                                <div class="author-box">
                                    <div class="author-box__header">
                                        <div class="author-box__avatar">
                                                                     
                                          
                                                                                                                                                                                                     
        <div class="osc-avatar-level _72x72">
        <div class="avatar-image">
            <a class="avatar-image__inner" href="https://my.oschina.net/u/2590759">
                                                            <div class="osc-avatar large-portrait _72x72" title="kerlomz" data-user-id="2590759">
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/portrait(1).gif" alt="kerlomz" title="kerlomz">
            </div>
                        </a>
        </div>
        <div class="avatar-level">
            <div class="level-circle" title="经验值: 22 / 200">
                                                     <svg width="72" height="72" viewBox="0 0 72 72">
                        <circle cx="36" cy="36" r="33.5" stroke-width="4" stroke="#FFFFFF" fill="none"></circle>
                        <circle cx="36" cy="36" r="34" stroke-width="3" stroke="#EEEEEE" fill="none"></circle>
                        <circle cx="36" cy="36" r="34" stroke-width="3" stroke="#E2D4B9" fill="none" transform="matrix(0, -1, 1, 0,0, 72)" stroke-dasharray="23.54 214"></circle>
                    </svg>
                            </div>
            <div class="level-label" title="等级: Lv1">
                                                    <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/lv1_small.png" srcset="https://static.oschina.net/new-osc/img/level/lv1_small.png 1x, https://static.oschina.net/new-osc/img/level/lv1_small@2x.png 2x" alt="Lv1">
                            </div>
        </div>
    </div>
                                        </div>
                                        <div class="author-box__info">
                                            <div class="author-name"><a href="https://my.oschina.net/u/2590759" target="_blank">kerlomz</a></div>
                                                                                                                                                                                                                                <div class="author-toolbar">
                                                    <div class="item-list">
                                                        <div class="item">
                                                                                                                                                                                                                                                        <div class="follow-btn" data-user-id="2590759" data-follow-status="1" data-status-style="simple-heart-text"><i class="oicon oicon-heart-light"></i><span class="text">关注</span></div>
                                                                                                                    </div>
                                                        <div class="item">
                                                                                                                        <a href="https://my.oschina.net/u/2590759" target="_blank" class="send-message-btn" data-user-id="2590759" data-user-name="kerlomz"><i class="oicon oicon-mail-light"></i><span class="text">私信</span></a>
                                                        </div>
                                                        <div class="item">
                                                                                                                        <a href="https://www.oschina.net/question/ask?user=2590759" target="_blank"><i class="oicon oicon-comment-light"></i><span class="text">提问</span></a>
                                                        </div>
                                                    </div>
                                                </div>
                                                                                    </div>
                                    </div>
                                    <div class="author-box__statistics">
                                        <div class="statistics-list">
                                            <a class="statistic" href="https://my.oschina.net/u/2590759" target="_blank">
                                                <div class="label">文章</div>
                                                <div class="value">
                                                    1
                                                </div>
                                            </a>
                                            <div class="statistic">
                                                <div class="label">经验值</div>
                                                <div class="value">
                                                    22
                                                </div>
                                            </div>
                                            <a class="statistic" href="https://my.oschina.net/u/2590759/followers" target="_blank">
                                                <div class="label">粉丝</div>
                                                <div class="value" data-user-id="2590759" data-followers-count="9" data-format="true">
                                                    9
                                                </div>
                                            </a>
                                            <a class="statistic" href="https://my.oschina.net/u/2590759/following" target="_blank">
                                                <div class="label">关注</div>
                                                <div class="value" data-user-id="2590759" data-following-count="0" data-format="true">
                                                    0
                                                </div>
                                            </a>
                                        </div>
                                    </div>
                                                                                                                <div class="author-box__catalogs">
                                            <div class="catalogs-header">
                                                <h4 class="catalogs-title">作者的专辑</h4>
                                                <div class="catalogs-extra">
                                                    <a href="https://my.oschina.net/u/2590759" target="_blank" title="查看全部专辑">全部</a>
                                                </div>
                                            </div>
                                            <div class="catalogs-list">
                                                                                                                                                                                                                                                                            <div class="catalog-item">
                                                            <a href="https://my.oschina.net/u/2590759?tab=newest&amp;catalogId=3763977" target="_blank" title="工作日志"><span class="icon"><i class="oicon oicon-book"></i></span><span class="text" title="工作日志">工作日志</span><span class="count">(1)</span></a>
                                                        </div>
                                                                                                                                                </div>
                                        </div>
                                                                    </div>
                            </div>
                        </div>
                    </div>

                                                                                            <div class="ad-box ad-box--label" style="margin-bottom: 24px;">
            <a name="blog_detail_right_sidebar_2" data-traceid="blog_detail_right_sidebar_2" data-tracepid="blog_detail_right_sidebar_2" href="https://wj.qq.com/s2/9352962/6110" target="_blank" title="">
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/blog_detail_right_sidebar_2_DyrGx.jpg" width="320" height="250">
            </a>
                        </div>
                                
                                        <div class="sidebar-section section-link-card">
                        <div class="link-card box-card box-card--shadow">
                            <div class="link-card__inner" style="background-image: url(&#39;https://static.oschina.net/new-osc/img/page/detail/bg-sharing-plan@2x.jpg&#39;)">
                                <div class="link-card__header">
                                    <div class="link-card__title">源创计划</div>
                                    <div class="link-card__extra">
                                        <a class="osc-button small" href="https://www.oschina.net/sharing-plan" target="_blank">立即入驻</a>
                                    </div>
                                </div>
                                <div class="link-card__content">
                                    <p>自媒体入驻开源社区，</p>
                                    <p>获百万流量，打造个人技术品牌</p>
                                </div>
                            </div>
                        </div>
                    </div>

                                        <div class="sidebar-section-list sidebar-section-list--compact box-card box-card--shadow">
                        <div class="sidebar-section section-recommend-blog">
                            <div class="section-header">
                                <h3 class="section-title">推荐关注</h3>
                                <div class="section-extra">
                                    <span class="toggle-refresh clickable refresh-loader" title="换一批">换一批 <i class="oicon oicon-refresh"></i></span>
                                </div>
                            </div>
                            <div class="section-body">
                                

    <div class="user-list">
                                    <div class="user-item">
                    <div class="user-item__inner">
                        <div class="user-item__avatar">
                            <a href="https://my.oschina.net/u/2607135" target="_blank" title="张锦飞">
                                                            <div class="osc-avatar small-portrait _40x40" title="张锦飞" data-user-id="2607135">
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/2607135_50.jpeg" alt="张锦飞" title="张锦飞">
            </div>
                                        </a>
                        </div>
                        <div class="user-item__body">
                            <div class="user-item__header">
                                <a href="https://my.oschina.net/u/2607135" target="_blank" title="张锦飞">张锦飞</a>
                            </div>
                            <div class="user-item__desc">
                                <div class="item-list">
                                                                            <div class="item">文章 58</div>
                                        <div class="item">访问 15.2W</div>
                                                                    </div>
                            </div>
                        </div>
                                            </div>
                </div>
                                                <div class="user-item">
                    <div class="user-item__inner">
                        <div class="user-item__avatar">
                            <a href="https://my.oschina.net/zbnb" target="_blank" title="杨彬Lennon">
                                                            <div class="osc-avatar small-portrait _40x40" title="杨彬Lennon" data-user-id="2768567">
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/50x50" alt="杨彬Lennon" title="杨彬Lennon">
            </div>
                                        </a>
                        </div>
                        <div class="user-item__body">
                            <div class="user-item__header">
                                <a href="https://my.oschina.net/zbnb" target="_blank" title="杨彬Lennon">杨彬Lennon</a>
                            </div>
                            <div class="user-item__desc">
                                <div class="item-list">
                                                                            <div class="item">文章 14</div>
                                        <div class="item">访问 8.8W</div>
                                                                    </div>
                            </div>
                        </div>
                                            </div>
                </div>
                                                <div class="user-item">
                    <div class="user-item__inner">
                        <div class="user-item__avatar">
                            <a href="https://my.oschina.net/bobliu0909" target="_blank" title="bobliu0909">
                                                            <div class="osc-avatar small-portrait _40x40" title="bobliu0909" data-user-id="3249328">
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/3249328_50.jpg" alt="bobliu0909" title="bobliu0909">
            </div>
                                        </a>
                        </div>
                        <div class="user-item__body">
                            <div class="user-item__header">
                                <a href="https://my.oschina.net/bobliu0909" target="_blank" title="bobliu0909">bobliu0909</a>
                            </div>
                            <div class="user-item__desc">
                                <div class="item-list">
                                                                            <div class="item">开源软件作者</div>
                                                                    </div>
                            </div>
                        </div>
                                            </div>
                </div>
                                                <div class="user-item">
                    <div class="user-item__inner">
                        <div class="user-item__avatar">
                            <a href="https://my.oschina.net/baoleiji" target="_blank" title="网安1476">
                                                            <div class="osc-avatar small-portrait _40x40" title="网安1476" data-user-id="2706427">
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/2706427_50.jpeg" alt="网安1476" title="网安1476">
            </div>
                                        </a>
                        </div>
                        <div class="user-item__body">
                            <div class="user-item__header">
                                <a href="https://my.oschina.net/baoleiji" target="_blank" title="网安1476">网安1476</a>
                            </div>
                            <div class="user-item__desc">
                                <div class="item-list">
                                                                            <div class="item">文章 33</div>
                                        <div class="item">访问 2.3W</div>
                                                                    </div>
                            </div>
                        </div>
                                            </div>
                </div>
                                                <div class="user-item">
                    <div class="user-item__inner">
                        <div class="user-item__avatar">
                            <a href="https://my.oschina.net/zhichengjiu" target="_blank" title="志成就">
                                                            <div class="osc-avatar small-portrait _40x40" title="志成就" data-user-id="4079957">
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/50x50(1)" alt="志成就" title="志成就">
            </div>
                                        </a>
                        </div>
                        <div class="user-item__body">
                            <div class="user-item__header">
                                <a href="https://my.oschina.net/zhichengjiu" target="_blank" title="志成就">志成就</a>
                            </div>
                            <div class="user-item__desc">
                                <div class="item-list">
                                                                            <div class="item">文章 242</div>
                                        <div class="item">访问 29.4W</div>
                                                                    </div>
                            </div>
                        </div>
                                            </div>
                </div>
                        </div>
                            </div>
                        </div>
                    </div>

                                                                                                            </div>
            </div>
        </div>
    </div>

        <div class="detail-toolbar-box">
        <div class="detail-toolbar-box__inner">
            <div class="action-box">
                <div class="action-item">
                                        <div class="action-item__button donate" donate="" data-id="3012574" data-obj-type="16344358" data-subject="验证码识别技术——CNN+BLSTM+CTC从训练到部署" data-donater="" data-author="2590759" data-return-url="https://my.oschina.net/u/2590759/blog/3012574" data-notify-url="https://my.oschina.net/action/donate/paySuccess">                         <i class="oicon oicon-money-bold"></i>
                    </div>
                    <div class="action-item__text">打赏</div>
                </div>
                <div class="action-item">
                                        <a class="action-item__button" href="https://my.oschina.net/u/2590759/blog/3012574#comments"><i class="oicon oicon-comment"></i></a>
                    <div class="action-item__text"><span data-article-reply-count="" data-value="0" data-format="true">0</span> 评论</div>
                </div>
                <div class="action-item">
                                        <div class="action-item__button collect-btn " data-id="3012574" data-user-id="2590759" data-obj-type="3" data-max="99" data-tag-required="" data-current-user-id="" data-recommend-tags="CTC,YAML,Bazel,Tornado,TensorFlow" data-uncollected-class="oicon oicon-star" data-collected-class="oicon oicon-star">
                        <i class="oicon oicon-star"></i>
                    </div>
                    <div class="action-item__text"><span data-collect-count="" data-id="3012574" data-obj-type="3">0</span> 收藏</div>
                </div>
                <div class="action-item">
                                        <div class="action-item__button like-btn toggle-article-like " data-id="3012574">
                        <i class="oicon oicon-thumb-up"></i>
                    </div>
                    <div class="action-item__text"><span data-article-like-count="">0</span> 赞</div>
                </div>
                <div class="action-item">
                                        <div class="osc-share ui floating dropdown" data-tag="share-blog" tabindex="0">
                        <div class="action-item__button"><i class="oicon oicon-share"></i></div>
                        <div class="menu" tabindex="-1">
                            <a class="item" data-platform="wechat" data-value="wechat"><i class="weixin icon"></i>微信</a>
                            <a class="item" data-platform="qq" data-value="qq"><i class="qq icon"></i>QQ</a>
                            <a class="item" data-platform="weibo" data-value="weibo"><i class="weibo icon"></i>微博</a>
                        </div>
                    </div>
                    <div class="action-item__text">分享</div>
                </div>
            </div>
        </div>
    </div>

</div>

<div id="groupCircleForm" class="ui group-circle small modal"><i class="close icon"></i> <div class="header">
        选择专区和圈子：<span></span></div> <div class="content"></div> <div class="actions"><div class="ui deny button">
            取消
        </div> <div class="ui positive button">
            确定
        </div></div></div>

<script type="text/javascript" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/blog" defer="defer"></script>
    <script type="text/javascript" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/space"></script>

        
            </div>
        </div>

                            <div id="footer" class="ui vertical footer segment mb-hide">
    <div class="ui container">
        <div class="ui grid">
            <div class="eight wide mobile three wide tablet two wide computer column">
                <h4 class="ui header">OSCHINA 社区</h4>
                <div class="ui link list">
                    <a class="item" href="https://www.oschina.net/home/aboutosc" target="_blank">关于我们</a>
                    <a class="item" href="https://www.oschina.net/home/aboutosc" target="_blank">联系我们</a>
                    <a class="item" href="https://www.oschina.net/news/131099/oschina-hiring" target="_blank">加入我们</a>
                    <a class="item" href="https://www.oschina.net/home/aboutosc#partners" target="_blank">合作伙伴</a>
                    <a class="item" href="https://www.oschina.net/openapi" target="_blank">Open API</a>
                </div>
            </div>
            <div class="eight wide mobile four wide tablet three wide computer column">
                <h4 class="ui header">在线工具</h4>
                <div class="ui link list">
                    <a class="item" href="https://gitee.com/?utm_source=oschina&amp;utm_medium=link-bottom&amp;utm_campaign=home" target="_blank">Gitee.com</a>
                    <a class="item" href="https://gitee.com/enterprises?utm_source=oschina&amp;utm_medium=link-bottom&amp;utm_campaign=enterprises" target="_blank">企业研发管理</a>
                    <a class="item" href="https://copycat.gitee.com/?utm_source=oschina&amp;utm_medium=link-bottom&amp;utm_campaign=copycat" target="_blank">CopyCat-代码克隆检测</a>
                    <a class="item" href="https://tool.oschina.net/" target="_blank">实用在线工具</a>
                    <a class="item" href="https://oscimg.oschina.net/oscnet/up-82a1d21cdcbd86bf819ffd854dc0f1c6d72.png" target="_blank" style="color: #cc0000">国家反诈中心APP下载</a>
                </div>
            </div>
            <div class="eight wide mobile three wide tablet two wide computer column">
                <h4 class="ui header">活动</h4>
                <div class="ui link list">
                    <a class="item" href="https://www.oschina.net/sharing-plan" target="_blank">源创计划</a>
                                        <a class="item" href="https://my.oschina.net/u/4855753/blog/4961507" target="_blank">月度评选</a>
                                        <a class="item" href="https://my.oschina.net/u/4855753/blog/5080467" target="_blank">“交个朋友”计划</a>
                </div>
            </div>
            <div class="center aligned eight wide mobile two wide tablet two wide computer column">
                <h4 class="ui header">QQ群</h4>
                <a href="https://jq.qq.com/?_wv=1027&amp;k=rfiPgVgE" target="_blank">
                    <img class="qrcode" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/qq_qrcode_2_new.png" alt="QQ交流群">
                </a>
                <div class="ui link list">
                    <a class="item qrcode-des" href="https://jq.qq.com/?_wv=1027&amp;k=rfiPgVgE" target="_blank">530688128</a>
                </div>
            </div>
            <div class="center aligned eight wide mobile two wide tablet two wide computer column">
                <h4 class="ui header">公众号</h4>
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/wechat_qrcode.jpg" alt="微信公众号">
            </div>
            <div class="center aligned eight wide mobile two wide tablet two wide computer column">
                <h4 class="ui header">视频号</h4>
                <img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/up-7f546da372c31b5421fedc29f7c202ab2c4.JPEG" alt="视频号" style="width: 65px">
            </div>
            <div class="center aligned eight wide mobile five wide tablet three wide computer column tb-hide">
                <h3 class="ui header">OSCHINA APP</h3>
                <p>聚合全网技术文章，根据你的阅读喜好进行个性推荐</p>
                <a href="https://www.oschina.net/app" target="_blank" class="ui large primary button">下载 APP</a>
            </div>
        </div>
    </div>
</div>
<div id="copyright">
    <div class="ui container">
        <div class="ui clearing basic segment">
            <div class="ui left floated horizontal link list">
                <div class="item">©OSCHINA(OSChina.NET)</div>
                <div class="item mb-hide">工信部</div>
                <a class="item mb-hide" href="http://www.copu.org.cn/" target="_blank" title="开源软件推进联盟">开源软件推进联盟</a>
                <div class="item mb-hide">指定官方社区</div>
            </div>
            <div class="ui right floated horizontal link list">
                <div class="item mb-hide">深圳市奥思网络科技有限公司版权所有</div>
                <a href="http://beian.miit.gov.cn/" target="_blank" class="item">粤ICP备12009483号</a>
            </div>
        </div>
    </div>
</div>        
                
    </div>
                
                            <style>.codeBlock:hover .oscCode{display: block !important;} .codeBlock{z-index: 2;position: fixed;right: 20px;bottom: 57px; overflow: hidden; margin-bottom: 4px;padding: 8px 0 6px;width: 40px;height: auto;box-sizing: content-box;cursor: pointer;border: 1px solid #ddd;background: #f5f5f5;text-align: center;transition: background 0.4s ease;}
@media only screen and (max-width: 767px){ .codeBlock{display: none;}}
</style>
    <div class="codeBlock">
        <img class="codeIcon" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/up-02f2706a81344119fb5cdcdda304068f2e0.png" alt="">
        <img class="oscCode" style="display:none;position: fixed;bottom: 62px;right: 69px;width: 120px;" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/up-e77d060131d9b392981650ec7beb614554f.JPEG" alt="">
    </div>

                    <div class="back-to-top back-to-top-toggle" style="display: none;">
        <div class="icon"><img src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/back-to-top.svg" alt="返回顶部"></div>
        <div class="text">顶部</div>
    </div>
        <script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/semantic.min.js.下载"></script>
    <script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/vue.min.js(1).下载"></script>
    <script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/jweixin-1.6.0.js.下载"></script>
    <script src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/wb.js.下载" type="text/javascript" charset="utf-8"></script>
                <script type="text/javascript" src="./验证码识别技术——CNN+BLSTM+CTC从训练到部署_files/space.d351ed09.js.下载"></script>                
<script>
    (function(){
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https'){
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else{
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>
<script>
    var _hmt = _hmt || [];
    _hmt.push(['_requirePlugin', 'UrlChangeTracker', {
        shouldTrackUrlChange: function (newPath, oldPath) {
            return newPath && oldPath;
        }}
    ]);
    (function() {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?a411c4d1664dd70048ee98afe7b28f0b";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
                

    
                                <div name="global_footer" data-traceid="global_footer" data-tracepid="global_footer">
                <!-- global_footer -->

<script type="text/javascript">
// 动弹话题页面描述加链接
$(function () {
  const el = $('.www-tweet .tweet-form-header .topic-desc');
  if (el && el.length > 0) {
    const desc = el.html();
    el.html(desc.replace(/http(s?):\/\/[\w\d-.\/?=]+/, url => `<a href="${url}" target="_blank">${url}</a>`));
  }
});
</script>
            </div>
            

<!-- Generated by oschina (init:4[ms],page:256[ms],ip:125.69.43.22) //--><div id="cyxy-swt-pre"><img src="chrome-extension://bcpaehbdfjabenmjjgjobmabkbnmkfkb/images/logo_64.png"></div><div id="cyxy-swt-pre"><img src="chrome-extension://bcpaehbdfjabenmjjgjobmabkbnmkfkb/images/logo_64.png"></div><div id="cyxy-swt-pre"><img src="chrome-extension://bcpaehbdfjabenmjjgjobmabkbnmkfkb/images/logo_64.png"></div></body></html>